分析过程不断更新中。。。
<html>
<head>
<title> Interaction </title>
<style>
canvas { width:100%; height:100%; background-color: black }
body { background-color: white };
</style>
</head>
<body>
<h1 align= "center" style="color:blue"> Interaction </h1>
<div style="width:1000px;">
<div style="float:left;display:inline-block; width:250px; margin-left:10px; padding:20px;">
<h3> Light </h3>
<table border="1">
<tr>
<td> Color </td>
<td> <input type="text" id="light-color" value="0xffffff"> </input> </td>
</tr>
<tr>
<td> Type </td>
<td>
<select id="light-type">
<option value="point"> Point Light </option>
<option value="spot"> Spot Light </option>
<option value="ambient"> Ambient Light </option>
<option value="area"> Area Light </option>
<option value="directional"> Directional Light </option>
<select>
</td>
</tr>
<tr>
<td> x position </td>
<td>
<input type="number" value="0" id="light-position-x"> </input>
</td>
</tr>
<tr>
<td> y position </td>
<td>
<input type="number" value="0" id="light-position-y"> </input>
</td>
</tr>
<tr>
<td> z position </td>
<td>
<input type="number" value="20" id="light-position-y"> </input>
</td>
</tr>
</table>
<button onClick="changeLightParameters()" style="width:130px;"> Apply </button>
</div>
<div style="float:left;display:inline-block; width:250px; margin-left:10px; padding:20px;">
<h3> Material </h3>
<table border="1">
<tr>
<td> Diffuse </td>
<td> <input type="text" id="material-diffuse" value="0xffffff"> </input> </td>
</tr>
<tr>
<td> Ambient </td>
<td> <input type="text" id="material-ambient" value="0xffffff"> </input> </td>
</tr>
<tr>
<td> Emissive </td>
<td> <input type="text" id="material-emissive" value="0xffffff"> </input> </td>
</tr>
<tr>
<td> Specular </td>
<td> <input type="text" id="material-specular" value="0xffffff"> </input> </td>
</tr>
<tr>
<td> Shininess </td>
<td> <input type="number" id="material-shininess" value="1"> </input> </td>
</tr>
<tr>
<td> Type </td>
<td>
<select id="material-type">
<option value="lambert"> Lambert </option>
<option value="normal"> Normal </option>
<option value="phong"> Phong </option>
</select>
</td>
</tr>
</table>
<button onClick="changeMaterialParameters()" style="width:130px;"> Apply </button>
</div>
<div style="float:left;display:inline-block; width:250px; margin-left:10px; padding:20px;">
<h3> Object </h3>
<table border="1">
<tr>
<td> Type </td>
<td>
<select id="object-type">
<option value= "sphere"> Sphere </option>
<option value= "cube"> Cube </option>
<option value= "cylinder"> Cylinder </option>
</select>
</td>
</tr>
</table>
<button onClick= "changeObjectParameters()" style="width:130px;"> Apply </button>
</div>
</div>
<script src="/Users/ramy/Documents/HTML/mrdoob-three.js-58e4622/build/three.min.js"></script>
<script>
// Funzioni per leggere i parametri:
function getLightParameters() {
var lightParameters={};
lightParameters.color= parseInt(document.getElementById("light-color").value,16);
lightParameters.position= new THREE.Vector3(
document.getElementById("light-position-x").value,
document.getElementById("light-position-y").value,
document.getElementById("light-position-z").value );
if(isNaN(lightParameters.color)) {
return null;
}
lightParameters.type= document.getElementById("light-type").value;
return lightParameters;
}
function getObjectParameters() {
var objectParameters={};
objectParameters.type= document.getElementById("object-type").value;
return objectParameters;
}
function getMaterialParameters() {
var materialParameters={};
materialParameters.diffuse= parseInt(document.getElementById("material-diffuse").value , 16);
materialParameters.ambient= parseInt(document.getElementById("material-ambient").value , 16);
materialParameters.emissive= parseInt(document.getElementById("material-emissive").value , 16);
materialParameters.specular= parseInt(document.getElementById("material-specular").value , 16);
materialParameters.shininess= document.getElementById("material-shininess");
if(isNaN(materialParameters.diffuse) || isNaN(materialParameters.ambient) || isNaN(materialParameters.emissive) || isNaN(materialParameters.specular) ) {
return null;
}
materialParameters.type= document.getElementById("material-type").value;
return materialParameters;
}
// Cambiare la scena:
function changeLightParameters() {
var lightParameters= getLightParameters();
if(lightParameters== null) {
alert("Invalid values");
return;
}
if(light.name!= lightParameters.type) {
scene.remove(light);
if(lightParameters.type== "spot") {
light= new THREE.SpotLight(lightParameters.color);
}
else if(lightParameters.type== "point") {
light= new THREE.PointLight(lightParameters.color);
}
else if(lightParameters.type== "ambient") {
light= new THREE.AmbientLight(lightParameters.color);
}
else if(lightParameters.type== "area") {
light= new THREE.AreaLight(lightParameters.color);
}
else if(lightParameters.type== "directional") {
light= new THREE.DirectionalLight(lightParameters.color);
}
light.position.set(lightParameters.position.x, lightParameters.position.y, lightParameters.position.z);
light.name= lightParameters.name;
scene.add(light);
}
else {
light.position= lightParameters.position;
light.color= new THREE.Color(lightParameters.color);
}
}
function changeObjectParameters() {
var objectParameters= getObjectParameters();
if(objectParameters== null) {
alert("Invalid values");
return;
}
if(object.name != objectParameters.type) {
scene.remove(object);
if(objectParameters.type== "sphere") {
geometry= new THREE.SphereGeometry(2,15,15);
}
else if(objectParameters.type== "cube") {
geometry= new THREE.CubeGeometry(2,2,2);
}
else if(objectParameters.type== "cylinder") {
geometry= new THREE.CylinderGeometry(1,1,2.5);
}
object= new THREE.Mesh(geometry,material);
object.name= objectParameters.type;
scene.add(object);
}
}
function changeMaterialParameters() {
var materialParameters= getMaterialParameters();
if(materialParameters== null) {
alert("Invalid values");
return;
}
if(materialParameters.type!= material.name) {
scene.remove(object);
if(materialParameters.type== "lambert") {
material= new THREE.MeshLambertMaterial({
color:materialParameters.diffuse,
ambient:materialParameters.ambient,
emissive:materialParameters.emissive });
}
else if(materialParameters.type== "normal") {
material= new THREE.MeshNormalMaterial();
}
else if(materialParameters.type== "phong") {
material= new THREE.MeshPhongMaterial({
color:materialParameters.diffuse,
ambient:materialParameters.ambient,
emissive:materialParameters.emissive,
specular:materialParameters.specular,
shininess:materialParameters.shininess });
}
material.name= materialParameters.type;
object= new THREE.Mesh(geometry,material);
scene.add(object);
}
else {
material.color= new THREE.Color(materialParameters.diffuse);
material.ambient= new THREE.Color(materialParameters.ambient);
material.emissive= new THREE.Color(materialParameters.emissive);
material.specular= new THREE.Color(materialParameters.specular);
material.shininess= new THREE.Color(materialParameters.shininess);
material.needsUpdate= true;
}
}
// Creazione scena, camera e renderer:
var scene= new THREE.Scene();
var camera= new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);
var renderer= new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth,window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z=5;
// Creazione geometria, materiale e oggetto:
var geometry= new THREE.SphereGeometry(1,15,15);
var material= new THREE.MeshLambertMaterial({color:0xffffff, ambient:0xffffff, emissive:0xffffff});
var object= new THREE.Mesh(geometry,material);
material.name= "lambert";
object.name= "sphere";
scene.add(object);
// Creazione luci:
var light= new THREE.PointLight(0xffffff);
light.position.set(0,0,20);
light.name= "point";
scene.add(light);
// Creazione della funzione di rendering:
var render= function() {
requestAnimationFrame(render);
renderer.render(scene,camera);
}
render();
</script>
</body>
</html>