2013-03-31 68 views
2

我已經嘗試通過創建網格物體並將它們作爲較大幾何體的一部分來改善渲染時間,並且只將該單一幾何體作爲我添加的對象現場。我認爲我仍然可以通過創建一組原始網格來管理對象的拾取,並將它們傳遞給raycaster。我用下面的代碼:Three.js raycaster交點空對象不是場景的一部分

var vector = new THREE.Vector3((loc_x/window.innerWidth) * 2 - 1, - (loc_y/window.innerHeight) * 2 + 1, 0.5); 
projector.unprojectVector(vector, camera); 
var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize()); 
var objects = []; 

var i = active_regions.length; 
while (i--) { 
    objects = objects.concat(active_regions[i].mesh_entities); 
} 
var intersects = raycaster.intersectObjects(objects); 
if (intersects.length > 0) { 
    console.log("Intersection: " + intersects); 
} 

所以在上面的代碼中,active_regions包含原始各個網格,和我即時創建一個數組來指定哪些對象我想從選擇。不幸的是相交出現空洞。

如果我稍微修改我的項目,以便將所有這些mesh_entities單獨添加到場景中,則上面的代碼可以工作,並且我可以成功選擇對象。不幸的是,整個場景呈現緩慢。

什麼是一種好的方法(或一些好的方法)讓我成功檢查與射線的交點,而不會減慢渲染速度?

謝謝!

回答

1

我解決了這個有一個鬼場景。從本質上講,我將所有對象添加到鬼場景中作爲其單獨的網格,然後當我使用raycaster時它就可以工作。

然而,我不得不沿着這些線路使用的功能:

function flip_render_ghost(yes) { 
    if (yes == true) { 
    scene_ghost.add(camera); 
    render_ghost = true; 
    } else { 
    scene.add(camera); 
    render_ghost = false; 
    } 
    render(); 
} 

function render() { 

    if (render_ghost == true) { 
    renderer.render(scene_ghost, camera); 
    } else { 
    renderer.render(scene, camera); 
    } 

} 

每當我要檢查是否有碰撞,我翻到渲染鬼現場,檢查是否命中,然後翻轉回正常渲染。

編輯:我自從發現對象不能屬於多個場景(雖然幾何圖形可以共享)。所以我所做的是爲拾取場景創建簡單的網格。這需要更多的內存,但是可以選擇使用更簡單的網格進行選擇以便更快地進行拾取。此外,它似乎對我來說,把幽靈場景的孩子們自己送到raycaster。您可能需要像我一樣,在鬼場景中的每個對象中添加一個屬性,以引用您嘗試選取的主對象。

+1

難道你也只是使用未添加到不同的渲染器屏幕而不必在兩個渲染器之間翻轉? – sharpper

+0

@sharper - 你找到了你的問題的答案? – AlvinfromDiaspar

0

我正在做類似的事情,並已驗證您需要渲染場景以進行適當的光線投射。然而,優化這一點很容易,只需渲染兩個屏幕,並且一個屏幕就可以清晰顯示。你應該可以更改您的代碼本,授予第二渲染調用將清除在第一個畫面:

function render() { 
    renderer.render(scene_ghost, camera); 
    renderer.render(scene, camera); 
} 
5

您需要手動更新對象的矩陣不是在渲染場景作爲其完成的部分所以如果您使用的是幽靈場景渲染過程中,你不需要以使其,做路口前剛剛更新的矩陣:

scene_ghost.updateMatrixWorld(true); 
+0

是的!我測試了它。工作沒有渲染和沒有相機。 – Qualphey

+0

這似乎是比標記答案更好的答案。 – AlvinfromDiaspar