2015-11-07 44 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