我写了的jsfiddle给你看看:http://jsfiddle.net/fnR4E/
var camera, scene, renderer;
var geometry = new Array();
var material = new Array();
var mesh = new Array();
var light;
var angle = 0.1;
init();
render();
function init() {
camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 1, 1000);
camera.position.z = 5;
camera.position.y = 5;
scene = new THREE.Scene();
geometry[0] = new THREE.SphereGeometry(1, 8, 6, 0, Math.PI * 2, 0, Math.PI);
geometry[1] = new THREE.SphereGeometry(1, 8, 6, 0, Math.PI * 2, 0, Math.PI);
geometry[2] = new THREE.SphereGeometry(1, 8, 6, 0, Math.PI * 2, 0, Math.PI);
material[0] = new THREE.MeshBasicMaterial({ color: 0xff0000 });
material[1] = new THREE.MeshLambertMaterial({ ambient: 0xffffff, color: 0x00FF00 });
material[2] = new THREE.MeshPhongMaterial({ ambient: 0xffffff, color: 0xdddddd, specular: 0xFFFFFF, shininess: 15 });
mesh[0] = new THREE.Mesh(geometry[0], material[0]);
mesh[1] = new THREE.Mesh(geometry[1], material[1]);
mesh[2] = new THREE.Mesh(geometry[2], material[2]);
var ambientLight = new THREE.AmbientLight(0x007700);
var light = new THREE.PointLight(0xFFFFFF);
light.position.set(0, 2, 0);
scene.add(ambientLight);
scene.add(light);
mesh[0].position.set(-2, 0, 0);
mesh[2].position.set(2, 0, 0);
scene.add(mesh[0]);
scene.add(mesh[1]);
scene.add(mesh[2]);
renderer = new THREE.CanvasRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
}
function render() {
requestAnimationFrame(render);
camera.position.x = 5 * Math.cos(angle);
camera.position.z = 5 * Math.sin(angle);
camera.lookAt(new THREE.Vector3(0, 0, 0));
angle += 0.01;
renderer.render(scene, camera);
}
的第一网状网络使用MeshBasicMaterial基本上意味着它是由材料的颜色单独点燃,为证明你可以改变ambientLight的值并照亮任何你想要的,它不会影响这个网格的渲染颜色。
以下两个网格(第一个是MeshLambertMaterial,第二个是MeshPhongMaterial)使用两个灯光。有关各阴影模型(朗伯和海防)背后的理论补充阅读检查出这些优秀的维基百科文章:
http://en.wikipedia.org/wiki/Lambertian_reflectance http://en.wikipedia.org/wiki/Phong_reflection_model
这里是正在发生的事情更“实用”的解释(但您可能至少要参考下面讨论的等式的wiki文章):
ambientLight乘以材料的“环境”值以生成网格环境颜色。这种颜色只能达到由材质的漫反射颜色指定的量。例如,如果材料环境值为0xFFFFFF且AmbientLight为0x00FF00,则网格具有完全绿色的环境光 - 但是,如果材质的漫反射颜色('颜色')包含NO绿色通道(例如0xFF00FF),则不存在施加到网格的环境光。或者,如果存在0x007700的漫反射颜色(全绿色通道的一半),则会在颜色0x007700的对象上看到环境光。
漫反射颜色由材质的“颜色”值表示。这是网格的感知颜色。在Lambert和BlinnPhong着色模型中,该颜色乘以光矢量的顶点或片段法线的点积。实质上,这意味着顶点或片段越直接点亮 - 越接近完全漫反射的颜色。光源根本不直接点亮的顶点或片段是黑色的。 AmbientLight光源不包含在此点积计算中。
注:遮挡网格是而不是占这个点积计算。只考虑光源与顶点或片段之间的角度。
最后,MeshPhongMaterial使用了一个名为specular的附加属性。这是在网格上产生“闪亮”点的反射光。这是通过计算来自光源的相对于法线的反射角。材质属性“高光”决定了这个反射点的颜色。 AmbientLight光源再次不包含在此光照计算中。
注意:再次,遮挡网格是而不是占这个计算。
修复了这个问题。
由于我的声望低于10,我显然不允许发布两个以上的链接。这两个wiki文章都值得包括,所以我把它们写成一个链接 - 希望有超过10个代表的人会通过将它们放在不同的线上来修复它。如果不是,应该很容易找出哪个是哪个。 – jconder
感谢您的信息。这很有帮助。 – rajkamal