Threejs 围绕 3d 矩阵轴中的另一个对象旋转一个对象
Threejs rotate an object around another object in 3d matrix axis
现在我可以设置一个轴旋转。
Working code:
https://codepen.io/itzkinnu/full/erwKzY
如何在随机轴而不是一个固定轴上旋转对象。
像这样
如果您希望一个对象相对于另一个对象定位,则必须将该对象添加为引用对象的子对象。
使用 Object3D.add
向对象添加子项。
看例子:
(function onLoad() {
var container, loader, camera, scene, renderer, controls, mesh, child;
init();
animate();
function init() {
container = document.getElementById('container');
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
camera.position.set(0, -4, -1.5);
loader = new THREE.TextureLoader();
loader.setCrossOrigin("");
scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
scene.add(camera);
window.onresize = resize;
var ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
directionalLight.position.x = -0.75;
directionalLight.position.y = -0.5;
directionalLight.position.z = -1;
scene.add( directionalLight );
controls = new THREE.OrbitControls(camera, renderer.domElement);
var axis = new THREE.AxesHelper(2);
scene.add(axis);
var material = new THREE.MeshPhongMaterial({color:'#f08080'});
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
mesh = new THREE.Mesh(geometry, material);
var material2 = new THREE.MeshPhongMaterial({color:'#8080f0'});
var geometry2 = new THREE.BoxGeometry( 1, 1, 1 );
child = new THREE.Mesh(geometry2, material2);
child.position.x = 1.5;
mesh.add(child);
scene.add(mesh);
}
function resize() {
var aspect = window.innerWidth / window.innerHeight;
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = aspect;
camera.updateProjectionMatrix();
}
function animate() {
child.position.set(0, 0, 0);
child.rotateY(0.02)
child.translateX(1.5);
mesh.position.set(0, 0, 0);
mesh.rotateZ(0.01);
mesh.translateX(1.0);
requestAnimationFrame(animate);
render();
}
function render() {
renderer.render(scene, camera);
}
})();
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="container"></div>
感谢 Rabbid76 的快速回复。它实际上有帮助。
我已经添加了
child.rotateY(0.02);
将上面代码中的animate函数改成随机轴旋转。
请问如何让child box自转?
(function onLoad() {
var container, loader, camera, scene, renderer, controls, mesh, child;
init();
animate();
function init() {
container = document.getElementById('container');
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
camera.position.set(0, -4, -1.5);
loader = new THREE.TextureLoader();
loader.setCrossOrigin("");
scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
scene.add(camera);
window.onresize = resize;
var ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
directionalLight.position.x = -0.75;
directionalLight.position.y = -0.5;
directionalLight.position.z = -1;
scene.add( directionalLight );
controls = new THREE.OrbitControls(camera, renderer.domElement);
var axis = new THREE.AxesHelper(2);
scene.add(axis);
var material = new THREE.MeshPhongMaterial({color:'#f08080'});
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
mesh = new THREE.Mesh(geometry, material);
var material2 = new THREE.MeshPhongMaterial({color:'#8080f0'});
var geometry2 = new THREE.BoxGeometry( 1, 1, 1 );
child = new THREE.Mesh(geometry2, material2);
child.position.x = 1.5;
mesh.add(child);
scene.add(mesh);
}
function resize() {
var aspect = window.innerWidth / window.innerHeight;
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = aspect;
camera.updateProjectionMatrix();
}
function animate() {
child.position.set(0, 0, 0);
child.rotateY(0.02)
child.translateX(1.5);
mesh.position.set(0, 0, 0);
mesh.rotateZ(0.01);
mesh.translateX(1.0);
requestAnimationFrame(animate);
render();
}
function render() {
renderer.render(scene, camera);
}
})();
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="container"></div>
现在我可以设置一个轴旋转。
Working code:
https://codepen.io/itzkinnu/full/erwKzY
如何在随机轴而不是一个固定轴上旋转对象。
像这样
如果您希望一个对象相对于另一个对象定位,则必须将该对象添加为引用对象的子对象。
使用 Object3D.add
向对象添加子项。
看例子:
(function onLoad() {
var container, loader, camera, scene, renderer, controls, mesh, child;
init();
animate();
function init() {
container = document.getElementById('container');
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
camera.position.set(0, -4, -1.5);
loader = new THREE.TextureLoader();
loader.setCrossOrigin("");
scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
scene.add(camera);
window.onresize = resize;
var ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
directionalLight.position.x = -0.75;
directionalLight.position.y = -0.5;
directionalLight.position.z = -1;
scene.add( directionalLight );
controls = new THREE.OrbitControls(camera, renderer.domElement);
var axis = new THREE.AxesHelper(2);
scene.add(axis);
var material = new THREE.MeshPhongMaterial({color:'#f08080'});
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
mesh = new THREE.Mesh(geometry, material);
var material2 = new THREE.MeshPhongMaterial({color:'#8080f0'});
var geometry2 = new THREE.BoxGeometry( 1, 1, 1 );
child = new THREE.Mesh(geometry2, material2);
child.position.x = 1.5;
mesh.add(child);
scene.add(mesh);
}
function resize() {
var aspect = window.innerWidth / window.innerHeight;
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = aspect;
camera.updateProjectionMatrix();
}
function animate() {
child.position.set(0, 0, 0);
child.rotateY(0.02)
child.translateX(1.5);
mesh.position.set(0, 0, 0);
mesh.rotateZ(0.01);
mesh.translateX(1.0);
requestAnimationFrame(animate);
render();
}
function render() {
renderer.render(scene, camera);
}
})();
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="container"></div>
感谢 Rabbid76 的快速回复。它实际上有帮助。
我已经添加了
child.rotateY(0.02);
将上面代码中的animate函数改成随机轴旋转。
请问如何让child box自转?
(function onLoad() {
var container, loader, camera, scene, renderer, controls, mesh, child;
init();
animate();
function init() {
container = document.getElementById('container');
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
camera.position.set(0, -4, -1.5);
loader = new THREE.TextureLoader();
loader.setCrossOrigin("");
scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
scene.add(camera);
window.onresize = resize;
var ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
directionalLight.position.x = -0.75;
directionalLight.position.y = -0.5;
directionalLight.position.z = -1;
scene.add( directionalLight );
controls = new THREE.OrbitControls(camera, renderer.domElement);
var axis = new THREE.AxesHelper(2);
scene.add(axis);
var material = new THREE.MeshPhongMaterial({color:'#f08080'});
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
mesh = new THREE.Mesh(geometry, material);
var material2 = new THREE.MeshPhongMaterial({color:'#8080f0'});
var geometry2 = new THREE.BoxGeometry( 1, 1, 1 );
child = new THREE.Mesh(geometry2, material2);
child.position.x = 1.5;
mesh.add(child);
scene.add(mesh);
}
function resize() {
var aspect = window.innerWidth / window.innerHeight;
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = aspect;
camera.updateProjectionMatrix();
}
function animate() {
child.position.set(0, 0, 0);
child.rotateY(0.02)
child.translateX(1.5);
mesh.position.set(0, 0, 0);
mesh.rotateZ(0.01);
mesh.translateX(1.0);
requestAnimationFrame(animate);
render();
}
function render() {
renderer.render(scene, camera);
}
})();
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="container"></div>