Three.js组渲染
Three.js group rendering
我正在尝试使用一个将要渲染的对象作为参数的函数(render2,第 35 行)来渲染具有 three.js 的一组对象,但它不起作用。只要有一个专为控制该立方体而构建的函数,我就可以使单个立方体旋转,但是当我尝试使用 render2 函数时出现错误。由 cubeGenerator 函数生成的立方体似乎与 groupRenderer 函数中的内容相匹配,这也与最初进入 render2 函数中的内容相匹配。之后render和render1函数按预期打印了cube和cube1的信息,但是render2函数打印出了一个数字和一个错误:
main.js:20 T…E.Mesh {uuid: "6902A0C3-7CFA-4B5C-A7BC-11259CE69113", name: "", type: "Mesh", parent: T…E.Scene, children: Array[0]…}
main.js:28 T…E.Mesh {uuid: "275129EB-BD99-4156-B208-CED6F49F6112", name: "", type: "Mesh", parent: T…E.Scene, children: Array[0]…}
main.js:36 408.2339999877149
main.js:38 Uncaught TypeError: Cannot read property 'x' of undefined
我在 http://threejs.org/ 上学习了 "Intro to WebGL with Three.js" 教程,在我尝试使用它之前它工作得很好。立方体和立方体 1 正在工作,但立方体组显示在屏幕上并且不旋转。我感谢任何帮助。这是我现在拥有的代码:
Line Code
1 var scene = new THREE.Scene();
2 var aspect = window.innerWidth / window.innerHeight;
3 var camera = new THREE.PerspectiveCamera(75, aspect, 0.1, 1000);
4 var renderer = new THREE.WebGLRenderer();
5 renderer.setSize(window.innerWidth, window.innerHeight);
6 document.body.appendChild(renderer.domElement);
7 camera.position.z = 10;
8
9 var geometry = new THREE.BoxGeometry(1, 1, 1);
10 var material = new THREE.MeshNormalMaterial();
11 var cube = new THREE.Mesh(geometry, material);
12 cube.position.x = -1;
13
14 var geometry1 = new THREE.BoxGeometry(1, 1, 1);
15 var material1 = new THREE.MeshNormalMaterial();
16 var cube1 = new THREE.Mesh(geometry1, material1);
17 cube1.position.x = 1;
18
19 var render = function() {
20 console.log(cube);
21 requestAnimationFrame(render);
22 cube.rotation.x += 0.05;
23 cube.rotation.y += 0.05;
24 renderer.render(scene, camera);
25 };
26
27 var render1 = function() {
28 console.log(cube1);
29 requestAnimationFrame(render1);
30 cube1.rotation.x += 0.05;
31 cube1.rotation.y += 0.05;
32 renderer.render(scene, camera);
33 }
34
35 var render2 = function(object) {
36 console.log(object);
37 requestAnimationFrame(render2);
38 object.rotation.x += 0.05;
39 object.rotation.y += 0.05;
40 renderer.render(scene, camera);
41 }
42
43 var cubeGenerator = function(newGroup) {
44 console.log("--------------------\nGenerating Cubes");
45 for (var i = -2; i < 2; i++) {
46 var newGeometry = new THREE.BoxGeometry(1, 1, 1);
47 var newMaterial = new THREE.MeshNormalMaterial();
48 var newCube = new THREE.Mesh(newGeometry, newMaterial);
49 newCube.position.x = i;
50 newGroup.add(newCube);
51 console.log(newCube);
52 }
53 console.log("Done Generating Cubes\n--------------------");
54 };
55
56 var groupRenderer = function(renderGroup) {
57 console.log("--------------------\nRendering Group");
58 for (object of group.children) {
59 console.log(object);
60 render2(object);
61 }
62 console.log("Done Rendering Group\n--------------------");
63 };
64
65 var group = new THREE.Group();
66 cubeGenerator(group);
67
68 scene.add(cube);
69 scene.add(cube1);
70 scene.add(group);
71 render();
72 render1();
73 groupRenderer(group);
我试过这个修改,但还是不行:
Line Code
43 var cubeGenerator = function(newGroup) {
44 console.log("--------------------\nGenerating Cubes");
45 for (var i = -2; i < 2; i++) {
46 // var newGeometry = new THREE.BoxGeometry(1, 1, 1);
47 // var newMaterial = new THREE.MeshNormalMaterial();
48 // var newCube = new THREE.Mesh(newGeometry, newMaterial);
49 // newCube.position.x = i;
50 // newGroup.add(newCube);
51 // console.log(newCube);
52 var clone = cube.clone();
53 clone.position.x = i;
54 newGroup.add(clone);
55 console.log(clone);
56 }
57 console.log("Done Generating Cubes\n--------------------");
58 };
注意:
该教程并不总是显示在 threejs.org 网站上,但应该通过刷新页面或导航离开并返回到它来显示。您可能需要尝试多次。
我想你只想渲染一次。如果你想旋转一个对象,你的例程是:
旋转 1(对象 1);
如果您希望一组对象一起旋转,请将对象添加到场景(并将场景添加到您的基础场景)并旋转场景。你的例程是:
旋转2(场景1);
编辑:已添加脚本
"use strict";
var renderer, scene, camera, light, geometry, material, mesh;
var scene2, mesh1, mesh2, mesh3, mesh4;
window.onload = function() {
renderer = new THREE.WebGLRenderer();
renderer.setSize(750, 750);
renderer.setClearColor( 0x102030, 1);
document.body.appendChild(renderer.domElement);
scene = new THREE.Scene(); // the base scene
camera = new THREE.PerspectiveCamera(30, 1);
camera.position.set(0, 0, 30);
camera.lookAt(new THREE.Vector3(0,0,0));
light = new THREE.AmbientLight(0x444444);
scene.add(light);
light = new THREE.DirectionalLight(0xff8888, 1);
light.position.set(10, 10, 20);
scene.add(light);
light = new THREE.DirectionalLight(0x88ff88, 1);
light.position.set(-10, 10, 20);
scene.add(light);
mesh1 = makebox(-3, -3, 0); // a couple of individual objects
scene.add(mesh1);
mesh2 = makebox(-3, 3, 0);
scene.add(mesh2);
scene2 = new THREE.Scene(); // a sub-scene, the boxes on the right
mesh3 = makebox( 0, -3, 0);
scene2.add(mesh3);
mesh4 = makebox( 0, 3, 0);
scene2.add(mesh4);
scene2.position.set(3, 0, 0);
scene.add(scene2);
fnloop();
}
function fnloop() {
mesh1.rotateY(.01); // individual object
scene2.rotateY(-.01); // scene of 2 objects
renderer.render(scene, camera);
requestAnimationFrame(fnloop);
}
function makebox(x, y, z) {
geometry = new THREE.BoxGeometry(1, 2, 3);
material = new THREE.MeshPhongMaterial( { color:0xffffff, wireframe:false } );
mesh = new THREE.Mesh(geometry, material);
mesh.position.set(x, y, z);
return mesh;
}
这完成了我想要的:
var scene = new THREE.Scene();
var aspect = window.innerWidth / window.innerHeight;
var camera = new THREE.PerspectiveCamera(75, aspect, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z = 10;
var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshNormalMaterial();
var cube = new THREE.Mesh(geometry, material);
cube.position.x = -1;
var geometry1 = new THREE.BoxGeometry(1, 1, 1);
var material1 = new THREE.MeshNormalMaterial();
var cube1 = new THREE.Mesh(geometry1, material1);
cube1.position.x = 1;
var render = function() {
requestAnimationFrame(render);
cube.rotation.x += 0.05;
cube.rotation.y += 0.05;
cube1.rotation.x += 0.05;
cube1.rotation.y += 0.05;
for (object of group.children) {
object.rotation.x += 0.05;
object.rotation.y += 0.05;
}
renderer.render(scene, camera);
};
var cubeGenerator = function(newGroup) {
console.log("--------------------\nGenerating Cubes");
for (var i = -2; i < 3; i++) {
var newGeometry = new THREE.BoxGeometry(1, 1, 1);
var newMaterial = new THREE.MeshNormalMaterial();
var newCube = new THREE.Mesh(newGeometry, newMaterial);
newCube.position.x = i;
newGroup.add(newCube);
console.log(newCube);
}
console.log("Done Generating Cubes\n--------------------");
};
var group = new THREE.Group();
cubeGenerator(group);
scene.add(cube);
scene.add(cube1);
scene.add(group);
render();
我将三个渲染函数合并为一个渲染每个对象的函数。 @dcromley 我认为你的解决方案会导致我的一组对象旋转,就好像它们是一个分段对象一样,但我想要的是一组对象以相同的方式旋转,但彼此分开(即五个立方体,每个都围绕自己的中心旋转,而不是五个立方体围绕中间立方体的中心旋转)。不过,也许我错了。
我正在尝试使用一个将要渲染的对象作为参数的函数(render2,第 35 行)来渲染具有 three.js 的一组对象,但它不起作用。只要有一个专为控制该立方体而构建的函数,我就可以使单个立方体旋转,但是当我尝试使用 render2 函数时出现错误。由 cubeGenerator 函数生成的立方体似乎与 groupRenderer 函数中的内容相匹配,这也与最初进入 render2 函数中的内容相匹配。之后render和render1函数按预期打印了cube和cube1的信息,但是render2函数打印出了一个数字和一个错误:
main.js:20 T…E.Mesh {uuid: "6902A0C3-7CFA-4B5C-A7BC-11259CE69113", name: "", type: "Mesh", parent: T…E.Scene, children: Array[0]…}
main.js:28 T…E.Mesh {uuid: "275129EB-BD99-4156-B208-CED6F49F6112", name: "", type: "Mesh", parent: T…E.Scene, children: Array[0]…}
main.js:36 408.2339999877149
main.js:38 Uncaught TypeError: Cannot read property 'x' of undefined
我在 http://threejs.org/ 上学习了 "Intro to WebGL with Three.js" 教程,在我尝试使用它之前它工作得很好。立方体和立方体 1 正在工作,但立方体组显示在屏幕上并且不旋转。我感谢任何帮助。这是我现在拥有的代码:
Line Code
1 var scene = new THREE.Scene();
2 var aspect = window.innerWidth / window.innerHeight;
3 var camera = new THREE.PerspectiveCamera(75, aspect, 0.1, 1000);
4 var renderer = new THREE.WebGLRenderer();
5 renderer.setSize(window.innerWidth, window.innerHeight);
6 document.body.appendChild(renderer.domElement);
7 camera.position.z = 10;
8
9 var geometry = new THREE.BoxGeometry(1, 1, 1);
10 var material = new THREE.MeshNormalMaterial();
11 var cube = new THREE.Mesh(geometry, material);
12 cube.position.x = -1;
13
14 var geometry1 = new THREE.BoxGeometry(1, 1, 1);
15 var material1 = new THREE.MeshNormalMaterial();
16 var cube1 = new THREE.Mesh(geometry1, material1);
17 cube1.position.x = 1;
18
19 var render = function() {
20 console.log(cube);
21 requestAnimationFrame(render);
22 cube.rotation.x += 0.05;
23 cube.rotation.y += 0.05;
24 renderer.render(scene, camera);
25 };
26
27 var render1 = function() {
28 console.log(cube1);
29 requestAnimationFrame(render1);
30 cube1.rotation.x += 0.05;
31 cube1.rotation.y += 0.05;
32 renderer.render(scene, camera);
33 }
34
35 var render2 = function(object) {
36 console.log(object);
37 requestAnimationFrame(render2);
38 object.rotation.x += 0.05;
39 object.rotation.y += 0.05;
40 renderer.render(scene, camera);
41 }
42
43 var cubeGenerator = function(newGroup) {
44 console.log("--------------------\nGenerating Cubes");
45 for (var i = -2; i < 2; i++) {
46 var newGeometry = new THREE.BoxGeometry(1, 1, 1);
47 var newMaterial = new THREE.MeshNormalMaterial();
48 var newCube = new THREE.Mesh(newGeometry, newMaterial);
49 newCube.position.x = i;
50 newGroup.add(newCube);
51 console.log(newCube);
52 }
53 console.log("Done Generating Cubes\n--------------------");
54 };
55
56 var groupRenderer = function(renderGroup) {
57 console.log("--------------------\nRendering Group");
58 for (object of group.children) {
59 console.log(object);
60 render2(object);
61 }
62 console.log("Done Rendering Group\n--------------------");
63 };
64
65 var group = new THREE.Group();
66 cubeGenerator(group);
67
68 scene.add(cube);
69 scene.add(cube1);
70 scene.add(group);
71 render();
72 render1();
73 groupRenderer(group);
我试过这个修改,但还是不行:
Line Code
43 var cubeGenerator = function(newGroup) {
44 console.log("--------------------\nGenerating Cubes");
45 for (var i = -2; i < 2; i++) {
46 // var newGeometry = new THREE.BoxGeometry(1, 1, 1);
47 // var newMaterial = new THREE.MeshNormalMaterial();
48 // var newCube = new THREE.Mesh(newGeometry, newMaterial);
49 // newCube.position.x = i;
50 // newGroup.add(newCube);
51 // console.log(newCube);
52 var clone = cube.clone();
53 clone.position.x = i;
54 newGroup.add(clone);
55 console.log(clone);
56 }
57 console.log("Done Generating Cubes\n--------------------");
58 };
注意: 该教程并不总是显示在 threejs.org 网站上,但应该通过刷新页面或导航离开并返回到它来显示。您可能需要尝试多次。
我想你只想渲染一次。如果你想旋转一个对象,你的例程是:
旋转 1(对象 1);
如果您希望一组对象一起旋转,请将对象添加到场景(并将场景添加到您的基础场景)并旋转场景。你的例程是:
旋转2(场景1);
编辑:已添加脚本
"use strict";
var renderer, scene, camera, light, geometry, material, mesh;
var scene2, mesh1, mesh2, mesh3, mesh4;
window.onload = function() {
renderer = new THREE.WebGLRenderer();
renderer.setSize(750, 750);
renderer.setClearColor( 0x102030, 1);
document.body.appendChild(renderer.domElement);
scene = new THREE.Scene(); // the base scene
camera = new THREE.PerspectiveCamera(30, 1);
camera.position.set(0, 0, 30);
camera.lookAt(new THREE.Vector3(0,0,0));
light = new THREE.AmbientLight(0x444444);
scene.add(light);
light = new THREE.DirectionalLight(0xff8888, 1);
light.position.set(10, 10, 20);
scene.add(light);
light = new THREE.DirectionalLight(0x88ff88, 1);
light.position.set(-10, 10, 20);
scene.add(light);
mesh1 = makebox(-3, -3, 0); // a couple of individual objects
scene.add(mesh1);
mesh2 = makebox(-3, 3, 0);
scene.add(mesh2);
scene2 = new THREE.Scene(); // a sub-scene, the boxes on the right
mesh3 = makebox( 0, -3, 0);
scene2.add(mesh3);
mesh4 = makebox( 0, 3, 0);
scene2.add(mesh4);
scene2.position.set(3, 0, 0);
scene.add(scene2);
fnloop();
}
function fnloop() {
mesh1.rotateY(.01); // individual object
scene2.rotateY(-.01); // scene of 2 objects
renderer.render(scene, camera);
requestAnimationFrame(fnloop);
}
function makebox(x, y, z) {
geometry = new THREE.BoxGeometry(1, 2, 3);
material = new THREE.MeshPhongMaterial( { color:0xffffff, wireframe:false } );
mesh = new THREE.Mesh(geometry, material);
mesh.position.set(x, y, z);
return mesh;
}
这完成了我想要的:
var scene = new THREE.Scene();
var aspect = window.innerWidth / window.innerHeight;
var camera = new THREE.PerspectiveCamera(75, aspect, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z = 10;
var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshNormalMaterial();
var cube = new THREE.Mesh(geometry, material);
cube.position.x = -1;
var geometry1 = new THREE.BoxGeometry(1, 1, 1);
var material1 = new THREE.MeshNormalMaterial();
var cube1 = new THREE.Mesh(geometry1, material1);
cube1.position.x = 1;
var render = function() {
requestAnimationFrame(render);
cube.rotation.x += 0.05;
cube.rotation.y += 0.05;
cube1.rotation.x += 0.05;
cube1.rotation.y += 0.05;
for (object of group.children) {
object.rotation.x += 0.05;
object.rotation.y += 0.05;
}
renderer.render(scene, camera);
};
var cubeGenerator = function(newGroup) {
console.log("--------------------\nGenerating Cubes");
for (var i = -2; i < 3; i++) {
var newGeometry = new THREE.BoxGeometry(1, 1, 1);
var newMaterial = new THREE.MeshNormalMaterial();
var newCube = new THREE.Mesh(newGeometry, newMaterial);
newCube.position.x = i;
newGroup.add(newCube);
console.log(newCube);
}
console.log("Done Generating Cubes\n--------------------");
};
var group = new THREE.Group();
cubeGenerator(group);
scene.add(cube);
scene.add(cube1);
scene.add(group);
render();
我将三个渲染函数合并为一个渲染每个对象的函数。 @dcromley 我认为你的解决方案会导致我的一组对象旋转,就好像它们是一个分段对象一样,但我想要的是一组对象以相同的方式旋转,但彼此分开(即五个立方体,每个都围绕自己的中心旋转,而不是五个立方体围绕中间立方体的中心旋转)。不过,也许我错了。