2015-11-07 67 views
1

我有一个容器包含三个对象,当容器以大的速度移动时,它的儿童开始闪烁,然后跳过一段时间,为什么这样呢?大速度的对象闪烁/跳跃

function init() { 
    // ... 
    geometry = new THREE.CubeGeometry(100, 100, 100); 
    mesh = new THREE.Mesh(geometry, material); 
    container.add(mesh); 

    geometry = new THREE.CubeGeometry(50, 50, 50); 
    mesh = new THREE.Mesh(geometry, material); 
    mesh.position.z = 75; 
    container.add(mesh); 

    geometry = new THREE.CubeGeometry(25, 25, 50); 
    mesh = new THREE.Mesh(geometry, material); 
    mesh.position.z = 100; 
    container.add(mesh); 
    // ... 
} 

function render() { 
    // The bigger the speed of object the more its jumping 
    container.position.z += 1000000; 
} 

jsfiddle

编辑: 我做了一些调查,发现的是,当我对孩子们的position适用modelVIewMatrix和比较这些孩子之间的差(距离),不同的是在一段时间后改变那就是当物体开始跳跃时。

jsfiddle

回答

1

主要问题是由浮点运算错误引起的..

从相机中使用的投影矩阵看起来是这样的 - 注意它包含非整数

[1.7243168354034424, 0, 0, 0, 
0, 2.1445069313049316, 0, 0, 
0, 0, -1.0002000331878662, -1, 
0, 0, -2.000200033187866, 0] 

JavaScript使用数字的浮点表示,虽然它在一定程度上可以很好地与整数一起使用,但实际数字通常存在轻微错误

例如,如果您键入0.1 + 0.2到javascript控制台输出不会是0.3,但0.30000000000000004

当您将立方体的位置thingy设置为几百万这些错误的投影矩阵,并变得明显,

的数字越大越差它得到,这就是为什么它开始时像一个SMaL公司的振动,然后变成彻底的失败

如果你真的需要的对象以移动的方式,你将不得不对三库进行更改,并以更多位(在某些字节阵列中)表示其矩阵数字,或者绕过浮点运算以其他方式演绎

+0

是的,你说得对,我发现three.js在矩阵中使用了'Float32Array',我试图把它改为64版本,不幸的是,它不可能,因为WebGL本身期望'Float32Array'类型:) – Buksy