2012-04-25 585 views
24

在Three.js中,我想讓攝像機指向3D空間中的一個點。ThreeJS camera.lookAt()沒有效果,有什麼我做錯了嗎?

爲此,我嘗試使用camera.lookAt功能,像這樣:

camera.lookAt(new THREE.Vector3(-100,-100,0)); 

然而,我發現呼叫有任何作用。它根本沒有做任何事情。我嘗試改變向量中的數字,並且在屏幕上始終保持相同的外觀,當它應該改變時。

我剛剛發現,如果我刪除THREE.TrackballControls我在我的代碼中,那麼camera.lookAt()就像它應該那樣工作。我如何使用THREE.TrackballControls有什麼問題?這是我對它們進行初始化:

controls = new THREE.TrackballControls(camera, renderer.domElement); 

    controls.rotateSpeed = 10.0; 
    controls.zoomSpeed = 1.2; 
    controls.panSpeed = 0.2; 

    controls.noZoom = false; 
    controls.noPan = false; 

    controls.staticMoving = true; 
    controls.dynamicDampingFactor = 1.0; 

    var radius = 5; 
    controls.minDistance = radius * 1.1; 
    controls.maxDistance = radius * 100; 

    controls.keys = [ 65, 83, 68 ]; // [ rotateKey, zoomKey, panKey ]*/ 

然後在我的渲染功能我做的:在three.js所

function render() { 
    controls.update(); 
    renderer.render(scene, camera); 
} 

文檔是非常稀缺的,所以我認爲我會問這裏。難道我做錯了什麼?

+0

向我們展示更多代碼。看看這個簡單的示例:http://jsfiddle.net/TE5bM/ – 2012-04-26 09:08:12

+0

你有更新循環,你重新渲染場景?這聽起來像你沒有更新/渲染。 – 2012-04-26 10:54:08

+0

@Juan George:我在設置場景之前調用.lookAt(),在渲染任何東西之前,所以我的調用應該有效果。不過,我想我只是發現了這個問題。我在我的代碼中有THREE.TrackballControls,我認爲它干擾了我告訴.lookAt(),因爲當我刪除THREE.TrackballControls時,.lookAt()函數就像它應該那樣工作。我在做什麼錯誤與THREE.TrackballControls? – houbysoft 2012-04-26 12:26:59

回答

40

綜觀THREE.TrackballControls的源代碼,我想通了,我可以讓相機的外觀,我想通過設置trackballControls.targetTHREE.Vector3我希望它看,然後重新描繪的情景。

+2

謝謝!我一直在尋找像永遠的答案,最後! – 2013-11-30 06:02:29

+2

正確答案! Set controls.target = new THREE.Vector3(1500,500,0);其中1500,500,0是我期望的目標,看看 – theprof 2014-01-26 17:26:24

+2

是的,正是我面臨的問題,併爲此我發佈了一個新的quesiton [這裏](http://stackoverflow.com/questions/26557252/inverse-of -camera-LOOKAT)。在我的例子中,通過初始化'target'屬性到傳遞給'camera.lookAt()'的相同向量手動更改'THREE.OrbitControls'的源代碼是**不可行,我寧願拿出一個反函數,所以我可以編寫像'target = getLookAtVectorFor(camera)'這樣的東西,並且每次更改相機的lookAt矢量時都不必更改OrbitControls.js的源代碼。 – 2014-10-26 15:06:54

3

是的請注意......看起來有THREE.TrackballControls或THREE.OrbitControls似乎覆蓋camera.lookAt函數,因爲當你實例化一個控件的實例時,你正在傳遞你的相機。您可能想要擺脫控件,然後執行camera.lookAt()或以其他方式補間相機,以驗證控件是否對您的相機產生重要影響。我搜索了一段時間爲什麼camera.lookat()似乎沒有效果。

0

我想通了。爲了防止THREE.TrackballControlsTHREE.OrbitControls從覆蓋camera.lookAt在初始化時,你需要的,而不是它是如何使用new THREE.Vector3()(默認目前實施更改設置控件target屬性等於camera.position矢量和camera.getWorldDirection()載體的總和行,到(0, 0, 0))。

因此,對於THREE.TrackballControls,變線39:

this.target = new THREE.Vector3().addVectors(/*new line for readability*/ 
    object.position, object.getWorldDirection()); 

也是一樣THREE.OrbitControls,上線36 我actaully沒有測試它在TrackballControls.js但它確實對OrbitControls.js工作。希望這可以幫助。

0

以下是另一種解決方案:創建一個具有0維度的對象(即多維數據集)。

var cameraTarget = new THREE.Mesh(new THREE.CubeGeometry(0,0,0)); 

在render函數中,將camera.lookAt設置爲cameraTarget的位置。

function render() { 
    camera.lookAt(cameraTarget.position); 
    renderer.render(scene, camera); 
} 

然後只要移動cameraTarget就可以了。

1

在我看來,我們不應該混淆原始代碼。我找到了解決任何特定問題的方法。 後,已宣佈的「控制」變量,只需執行的這兩行代碼:

// Assuming you know how to set the camera and myCanvas variables 
control = new THREE.OrbitControls(camera, myCanvas); 

// Later in your code 
control.object.position.set(camX, camY, camZ); 
control.target = new THREE.Vector3(targetX, targetY, targetZ); 

請在我的腦海,這將焦點的中心切換到新的目標。換句話說,你的新目標將成爲相機所有旋轉的中心。在熟悉操作攝像機並採用默認中心時,有些部分很難看清楚。嘗試儘可能地放大,你就會對我的意見有所瞭解 希望得到這個幫助。

相關問題