簡體   English   中英

如何使用SceneKit的unprojectPoint將2D點轉換為3D而沒有深度值?

[英]How to convert 2D point to 3D using SceneKit's unprojectPoint without having a depth value?

是否可以使用SceneKit的unprojectPoint將2D點轉換為3D而不具有深度值? 我只需要在XZ平面上找到3D位置。 Y可以始終為0或任何值,因為我沒有使用它。

我正在嘗試為iOS 8 Beta做這個。

我有類似於JavaScript和Three.js(WebGL)的東西,如下所示:

function getMouse3D(x, y) {
    var pos = new THREE.Vector3(0, 0, 0);
    var pMouse = new THREE.Vector3(
        (x / renderer.domElement.width) * 2 - 1,
       -(y / renderer.domElement.height) * 2 + 1,
       1
    );
    //
    projector.unprojectVector(pMouse, camera);

    var cam = camera.position;
    var m = pMouse.y / ( pMouse.y - cam.y );

    pos.x = pMouse.x + ( cam.x - pMouse.x ) * m;
    pos.z = pMouse.z + ( cam.z - pMouse.z ) * m;

    return pos;
};

但我不知道如何使用unprojectVector將部件轉換為SceneKit。


我想要做的是只能在XZ平面中拖動一個對象。 垂直軸Y將被忽略。

由於對象需要沿着平面移動,因此一種解決方案是使用hitTest方法,但我認為在每次觸摸/拖動事件中都不是很好。 此外,它也不允許物體移動到飛機外。

我試着根據公認的答案的解決方案在這里 ,但它並沒有奏效。 對unprojectPoint使用一個深度值,如果在+/- Z方向上拖動對象,則對象不會在手指下停留太長時間,而是會遠離它移動它。 我需要讓拖動的物體留在手指下,無論它在XZ平面中移動到哪里。

首先,您是否真的在xz平面或xy平面中尋找位置? 默認情況下,攝像機在-z方向上查看,因此3D場景套件坐標系的x軸和y軸的方向與在2D視圖坐標系中的方向相同。 (嗯,默認情況下,y在UIKit中翻轉,但它仍然是垂直軸。)然后xz平面與屏幕平面正交。

其次,深度值是從2D轉換為3D的必要部分。 我不是關於three.js的專家,但是通過查看他們的庫文檔 (顯然無法鏈接到),他們的unprojectVector仍然使用Vector3 這就是你在上面的代碼中為pMouse構建的 - 一個z和y坐標來自2D鼠標位置,其z坐標為1的向量。

SceneKit的unprojectPoint以相同的方式工作 - 它采用一個點,其z坐標指的是剪輯空間中的深度,並將其映射到場景世界空間中的一個點。

如果您的世界空間的方向使得您關注的唯一變體位於x軸和y軸上,則可以傳遞任何想要unprojectPoint的z值,並忽略您返回的矢量中的z值。 否則,傳遞-1以映射到遠剪裁平面, 1傳遞給近剪裁平面,或者傳遞0到中間 - 半徑為z坐標(在相機空間中)為0 如果您使用未投影的點在場景中定位節點,最好的建議是嘗試不同的z值(介於-1和1之間),直到獲得所需的行為。

但是,考慮一下你正在使用未投影的矢量是個好主意 - 如果你要做的下一件事就是測試場景幾何的交叉點,那么看看hitTest:相反。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM