2014-06-23 16 views
5

È possibile utilizzare SceneKit unprojectPoint per convertire un punto 2D in 3D senza avere un valore di profondità? Ho solo bisogno di trovare la posizione 3D nel piano XZ. Y può essere sempre 0 o qualsiasi valore poiché non lo sto usando.Come convertire il punto 2D in 3D usando un unprojectPoint di SceneKit senza avere un valore di profondità?

Sto provando a farlo per iOS 8 Beta.

ho avuto qualcosa di simile con Javascript e Three.js (WebGL) come questo:

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; 
}; 

Ma non so come tradurre la parte con unprojectVector a SceneKit.


Quello che voglio fare è poter trascinare un oggetto sul piano XZ. L'asse verticale Y verrà ignorato.

Poiché l'oggetto dovrebbe spostarsi lungo un piano, una soluzione sarebbe utilizzare il metodo hitTest, ma non penso che sia molto buona in termini di prestazioni per farlo per ogni evento touch/trascinamento. Inoltre, non permetterebbe all'oggetto di spostarsi all'esterno del piano.

Ho provato una soluzione basata sulla risposta accettata here, ma non ha funzionato. Utilizzando un valore di profondità per unprojectPoint, se si trascina l'oggetto nella direzione +/- Z, l'oggetto non rimane troppo a lungo sotto il dito, ma si allontana invece da esso. È necessario che l'oggetto trascinato rimanga sotto il dito, indipendentemente da dove viene spostato nel piano XZ.

risposta

2

In primo luogo, stai effettivamente cercando una posizione nel piano xz o nel piano xy? Per impostazione predefinita, la telecamera guarda nella direzione -z, quindi gli assi xey del sistema di coordinate 3D Scene Kit vanno nella stessa direzione come fanno nel sistema di coordinate della vista 2D. (Beh, y è ruotato di default in UIKit, ma è ancora l'asse verticale.) Il piano xz è quindi ortogonale al piano dello schermo.

In secondo luogo, un valore di profondità è una parte necessaria della conversione da 2D a 3D. Non sono un esperto di three.js, ma guardando il loro library documentation (che a quanto pare non può essere collegato), il loro unprojectVector prende ancora un Vector3. Ed è quello che si sta costruendo per pMouse nel codice sopra - un vettore il cui Z e coordinate y venire dalla posizione del mouse 2D, e la cui coordinata z è 1.

di SceneKit unprojectPoint funziona allo stesso modo - è prende un punto la cui coordinata z si riferisce a una profondità in clip space e la mappa in un punto dello spazio mondiale della scena.

Se lo spazio del tuo mondo è orientato in modo tale che l'unica variazione a cui tieni sia negli assi xe y, puoi passare qualsiasi valore z che vuoi a unprojectPoint e ignorare il valore z nel vettore che riprendere. In caso contrario, passare -1 per mappare sul piano di ritaglio lontano, 1 per il piano di ritaglio vicino, o 0 per metà strada - l'aereo la cui coordinata z (nello spazio della telecamera) è 0. Se stai usando il punto non proiettato per posizionare un nodo nella scena, il consiglio migliore è semplicemente provare diversi valori z (tra -1 e 1) finché non ottieni il comportamento che desideri.

Tuttavia, è una buona idea pensare a quello che stai usando un vettore non proiettato per - se la prossima cosa che faresti con esso è testare le intersezioni con la geometria della scena, guarda invece a hitTest:.

+0

Per favore guarda la mia risposta per vedere cosa sto cercando di fare. – CAM

Problemi correlati