首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定渲染网格的最终颜色?

如何确定渲染网格的最终颜色?
EN

Stack Overflow用户
提问于 2013-12-23 04:58:59
回答 1查看 400关注 0票数 0

我们在初始化材料时给出颜色。我们还指定了一个颜色,同时初始化环境和方向光源。如何确定网格的最终颜色。

当我改变材料的颜色时,我看不出网格的最终颜色有什么变化。然而,呈现的颜色的网格是变化的,而我改变了光源的颜色(环境或方向)。

所以

1)在初始化材料时指定颜色的用途是什么?

2)如何确定网格的最终颜色?

代码语言:javascript
复制
darkMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000 } );
darkMaterialL = new THREE.MeshLambertMaterial( { color: 0xffff00 } );
darkMaterialP = new THREE.MeshPhongMaterial( { color: 0xffff00 } );

var ambientLight = new THREE.AmbientLight(0x00ff00);
var light = new THREE.PointLight(0x000000);
light.position.set(0,150,100);

scene.add(ambientLight);
scene.add(light);

以上是我使用的灯和材料。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-24 03:07:16

我给你写了一个小提琴,让你看一看:http://jsfiddle.net/fnR4E/

代码语言:javascript
复制
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)使用这两个灯。关于每一种阴影模型(Lambertian和Phong)背后的理论的更多阅读,请查阅维基百科的以下优秀文章:

reflectance model

下面是对正在发生的事情的更“实用”的解释(但您可能至少希望参考下面讨论的方程式的wiki文章):

ambientLight被乘以材料的‘环境’值,以产生网格环境颜色。这种颜色只能使用到材料的漫射颜色所指定的数量。例如,如果材料环境值为0xFFFFFF,而AmbientLight为0x00F00,则网格具有完全绿色的环境光--但是,如果材料的漫射颜色(“颜色”)没有绿色通道(例如,0xFF00FF),那么网格上就没有环境光。或者,如果有一个漫射颜色0x007700 (完全绿色通道的一半),那么你将看到周围的光线在物体上的颜色0x007700。

漫射色用材料的颜色值来表示。这是被感知到的网格颜色。在Lambert和BlinnPhong阴影模型中,这种颜色被与光矢量法向的顶点或碎片的点乘积相乘。本质上,这意味着一个顶点或碎片越直接亮起--它就越接近整个漫射颜色。一个根本不被光源直接照亮的顶点或碎片是黑色的。AmbientLight源不包括在此点积计算中。

注:在此点积计算中不考虑遮挡网格。只考虑光源与顶点或碎片之间的角度。

最后,MeshPhongMaterial使用了一个名为specular的附加属性。这是反射光,在一个网格上产生“闪亮”点。这来自于计算反射角度与正常从光源。物质性质“镜面”决定了这个反射点的颜色。同样,AmbientLight光源不包括在此照明计算中。

注:同样,在此计算中不考虑遮挡网格。

解决了这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20737217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档