ada*_*ch1 18 javascript three.js
我试图改变网格的单个面上的颜色.这是在WebGL上下文中.我可以改变整个网格颜色,而不是单个面.相关代码如下:
// Updated Per Lee!
var camera = _this.camera;
var projector = new THREE.Projector();
var vector = new THREE.Vector3( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1, 0.5 );
projector.unprojectVector( vector, camera );
var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
var intersects = ray.intersectObjects( kage.scene.children );
if ( intersects.length > 0 ) {
face = intersects[0].face;
var faceIndices = ['a', 'b', 'c', 'd'];
var numberOfSides = ( face instanceof THREE.Face3 ) ? 3 : 4;
// assign color to each vertex of current face
for( var j = 0; j < numberOfSides; j++ ) {
var vertexIndex = face[ faceIndices[ j ] ];
// initialize color variable
var color = new THREE.Color( 0xffffff );
color.setRGB( Math.random(), 0, 0 );
face.vertexColors[ j ] = color;
}
}
Run Code Online (Sandbox Code Playgroud)
我也初始化了对象,在本例中是一个Cube,如下所示:
// this material causes a mesh to use colors assigned to vertices
var material = new THREE.MeshBasicMaterial( {
color: 0xf0f0f0,
shading: THREE.FlatShading,
vertexColors: THREE.VertexColors
});
var directionalLight = new THREE.DirectionalLight(0xEEEEEE);
directionalLight.position.set(10, 1, 1).normalize();
kage.scene.add(directionalLight);
var cube = new THREE.Mesh(new THREE.CubeGeometry(300, 300, 300,1,1,1), material);
cube.dynamic = true;
kage.scene.add(cube);
Run Code Online (Sandbox Code Playgroud)
无论光线颜色如何,更改材料都会使立方体变白.交叉逻辑仍然有效,这意味着我选择了正确的面部,但唉颜色不会改变.
我是Stackoverflow的新手[好问一个问题,希望我的编辑不会混淆]
Val*_*lay 24
vertexColors: THREE.FaceColors材料.最后用face.color.setRGB( Math.random(),
Math.random(), Math.random()).
现在无需遍历4个侧面(a,b,c,d)THREE.Face4或3个侧面(a,b,c)的
循环THREE.Face3.
这适用于WebGL和Canvas渲染.
假设"myGeometry"是包含要更改颜色的面的几何体,"faceIndex"是您想要更改颜色的特定面的索引.
// the face's indices are labeled with these characters
var faceIndices = ['a', 'b', 'c', 'd'];
var face = myGeometry.faces[ faceIndex ];
// determine if face is a tri or a quad
var numberOfSides = ( face instanceof THREE.Face3 ) ? 3 : 4;
// assign color to each vertex of current face
for( var j = 0; j < numberOfSides; j++ )
{
var vertexIndex = face[ faceIndices[ j ] ];
// initialize color variable
var color = new THREE.Color( 0xffffff );
color.setRGB( Math.random(), 0, 0 );
face.vertexColors[ j ] = color;
}
Run Code Online (Sandbox Code Playgroud)
然后,网格需要使用以下材质,以便从顶点派生面颜色:
// this material causes a mesh to use colors assigned to vertices
var cubeMaterial = new THREE.MeshBasicMaterial(
{ color: 0xffffff, shading: THREE.FlatShading,
vertexColors: THREE.VertexColors } );
Run Code Online (Sandbox Code Playgroud)
我对three.js 比较陌生,但是这些示例中的大多数看起来都过于冗长和复杂。以下代码似乎为立方体的所有 12 个三角形面着色......(WebGLRenderer r73)。
这样做时我注意到的一件事是面孔的顺序有点奇怪(至少对我来说是新手)。
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
console.log(geometry.faces.length); // 12 triangles
geometry.faces[0].color = new THREE.Color(0x000000); //Right 1
geometry.faces[1].color = new THREE.Color(0xFF0000); //Right 2
geometry.faces[2].color = new THREE.Color(0xFF8C08); //Left 1
geometry.faces[3].color = new THREE.Color(0xFFF702); //Left 2
geometry.faces[4].color = new THREE.Color(0x00FF00); //Top 1
geometry.faces[5].color = new THREE.Color(0x0000FF); //Top 2
geometry.faces[6].color = new THREE.Color(0x6F00FF); //Bottom 1
geometry.faces[7].color = new THREE.Color(0x530070); //Bottom 2
geometry.faces[8].color = new THREE.Color(0x3F3F3F); //Front 1
geometry.faces[9].color = new THREE.Color(0x6C6C6C); //Front 2
geometry.faces[10].color = new THREE.Color(0xA7A7A7);//Rear 1
geometry.faces[11].color = new THREE.Color(0xFFFFFF);//Rear 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33691 次 |
| 最近记录: |