three.js - 设置对象相对于其自身轴的旋转

时间:2014-08-14 16:26:18

标签: three.js

我正在尝试用点云制作静态3D棱镜,每个点都有特定数量的粒子。我根据转弯角度获得了棱镜每一侧的角坐标,并尝试在这些坐标约束的区域内产生粒子。相反,结果点云只保留左下角坐标。

屏幕截图:http://i.stack.imgur.com/uQ7Q8.png

我试图设置每个云对象的旋转,使它们的边缘相交,但它们只会围绕世界中心旋转。我认为这与旋转矩阵和欧拉角有关,但是,我已经试图将它们用了3天,我已经绝望了。 (我是社会学家,而不是开发者,在此项目之前没有触及图形。)

请帮帮忙?如何在棱镜的每个面上设置旋转?或者也许有一种更合理的方法让粒子首先在正确的区域产生?

代码:

// draw the particles

var n = 0;

do {

    var geom = new THREE.Geometry();    
    var material = new THREE.PointCloudMaterial({size: 1, vertexColors: true, color: 0xffffff});    

    for (i = 0; i < group[n]; i++) {

        if (geom.vertices.length < group[n]){

            var particle = new THREE.Vector3(

                Math.random() * screens[n].bottomrightback.x + screens[n].bottomleftfront.x,                    
                Math.random() * screens[n].toprightback.y + screens[n].bottomleftfront.y,                   
                Math.random() * screens[n].bottomrightfront.z + screens[n].bottomleftfront.z);

           geom.vertices.push(particle);       
           geom.colors.push(new THREE.Color(Math.random() * 0x00ffff));             
        }
    }

    var system = new THREE.PointCloud(geom, material);
    scene.add(system);

    **// something something matrix Euler something?**


n++
}           
while (n < numGroups); 

1 个答案:

答案 0 :(得分:0)

  

我试图设置每个云对象的旋转,以便他们的   边缘相遇,但它们只会围绕世界中心旋转。

确实,它们仅在0,0,0左右旋转。然后,简单的解决方案是将对象移动到中心,旋转它,然后将其移回原始位置。

例如(代码未经过测试,可能需要稍微调整一下):

var m = new THREE.Matrix4();

var movetocenter = new THREE.Matrix4();
movetocenter.makeTranslation(-x, -y, -z);

var rotate = new THREE.Matrix4();
rotate.makeRotationFromEuler(); //Build your rotation here

var moveback = new THREE.Matrix4();
moveback .makeTranslation(x, y, z);

m.multiply(movetocenter);
m.multiply(rotate);
m.multiply(moveback); 

//Now you can use geometry.applyMatrix(m)