javascript - Three.js中如何计算对象的位置
问题描述
我是 3D 图形编程的新手。我正在使用 Three.js 设计一个使用 3D 可视化进行 3D bin 包装的软件。现在我正在使用下面的代码来创建和定位两个元素。
var camera, scene, renderer;
var mesh, mesh2;
init();
function init() {
camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.z = 800;
scene = new THREE.Scene();
var texture = new THREE.TextureLoader().load( 'https://threejs.org/examples/textures/crate.gif' );
var geometry = new THREE.BoxBufferGeometry( 200, 200, 200 );
var geometry2 = new THREE.BoxBufferGeometry( 200, 200, 200 );
var material = new THREE.MeshBasicMaterial( {map:texture} );
mesh = new THREE.Mesh( geometry, material );
mesh2 = new THREE.Mesh( geometry2, material );
mesh2.position.x = 170
mesh2.position.y = -48
mesh2.position.z = 100
mesh.rotation.x = 0.45;
mesh.rotation.y = 1;
mesh2.rotation.x = 0.45;
mesh2.rotation.y = 1;
scene.add( mesh2 );
scene.add( mesh );
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
}
现在我使用 (170, -48, 100) 作为坐标来对齐第二个立方体。我通过调整数字并不断检查来得出这些数字。但是应该有一些公式来获得这些 x,y,z,因为我将它们旋转到某个角度(x = 0.45,y = 1)。我不确定如何开始计算。
问题陈述是,给定一组立方体尺寸'(l1,w1,h1),(h2,w2,h2)等和立方体位置(x1,y1,z1)(x2,y2,z2)如何计算并将它们放在附近和/或堆叠起来?
解决方案
使 mesh2 成为网格的子项:mesh.add( mesh2 )
mesh2
将继承旋转,mesh
您将定义相对偏移以在父坐标空间中移动它。
固定示例:
mesh = new THREE.Mesh( geometry, material );
mesh2 = new THREE.Mesh( geometry2, material );
mesh2.position.x = 170
//mesh2.position.y = -48
//mesh2.position.z = 100
mesh.rotation.x = 0.45;
mesh.rotation.y = 1;
//mesh2.rotation.x = 0.45;
//mesh2.rotation.y = 1;
scene.add( mesh );
mesh.add( mesh2 ); // << ---- solution
更新:也可能没有父子层次结构。
let mesh = new THREE.Mesh( geometry, material );
let mesh2 = new THREE.Mesh( geometry2, material );
// mesh2.position.x = 170
// mesh2.position.y = -48
// mesh2.position.z = 100
mesh.rotation.x = 0.45;
mesh.rotation.y = 1;
mesh.updateMatrix(); // <<-- this is essential, to write .position and .rotation values into object transformation matrix.
// mesh2.rotation.x = 0.45;
// mesh2.rotation.y = 1;
scene.add( mesh );
// apply local transforms
mesh2.applyMatrix(new THREE.Matrix4().makeTranslation(210, 0, 0));
// apply transforms of mesh on top
mesh2.applyMatrix(mesh.matrix);
scene.add( mesh2 ); // << ---- add directly to Scene
推荐阅读
- python - 变量外的函数更改自发
- r - 如何从字符串中提取包含在单词组/单词列表中的单词?
- android - 从 Fragment 到 Activity 的 Widget 数据
- javascript - 如何按类别排列数组?
- graphics - 如果可以使用网格属性,为什么要使用着色器?
- python-3.x - 有没有办法使用 pygad 模块执行多目标分析?
- android - Visual Studio 无法创建新的 Android 设备
- java - 如何在 Android 应用程序中使用 HttpURLConnection?
- rust - 如何提取给定字符之前的字符串前缀?
- java - 使用带有字符串的 findViewById 查找对象始终返回 null