Экран к мировым координатам в JavaScript WebGL - PullRequest
1 голос
/ 15 июня 2011

Я пытаюсь найти точку (экран с мировыми координатами) в моих данных, используя следующий код (на основе Нажмите, чтобы увеличить WebGL ):

    var world1 = [0,0,0,0] ;
    var world2 = [0,0,0,0] ;
    var dir    = [0,0,0] ;
    var w      = event.srcElement.clientWidth ;
    var h      = event.srcElement.clientHeight ;
    // calculate x,y clip space coordinates
    var x      = (event.offsetX-w/2)/(w/2) ;
    var y      = -(event.offsetY-h/2)/(h/2) ;
    mat4.inverse(pvMatrix, pvMatrixInverse) ;
    // convert clip space coordinates into world space
    mat4.multiplyVec4(pvMatrixInverse, [x,y,0,1], world1) ;

для простоты я установил ряд вершин, где координата z всегда равна 0: координаты, которые я строю:

0.0 0.0 0.0
1.0 1.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
0.5 0.5 0.0

Затем я сравниваю значения в world1 с моими вершинами,Значения в world1 не соответствуют тому, где я знаю, что нажал.Кто-нибудь может помочь с этим?

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Пожалуйста, посмотрите мой аналогичный ответ на Как получить объект в трехмерном пространстве WebGL из координаты щелчка мыши .

TL; DR: Я не думаю, что ваша функция unproject завершена.Посмотрите на источник по адресу jax / camera.js # L568 для другой реализации.См. Также реализацию glhUnProjectf C , на которой основано (свободно) первое.

И последнее.Будьте осторожны с элементом HTML-холста.Довольно часто он не позиционируется там, где вы думаете, и единственный способ обеспечить точное расположение пикселей - это пройти вверх через DOM.См. jax / events.js # L6 и jax / events.js # L100 для примеров этого.Или используйте функцию jQuery $('#canvas').offset() и покончите с этим.:)

0 голосов
/ 16 июня 2011

В общем, когда вы «не проектируете» точку пространства клипа, такую ​​как [x, y, z, 1], вы получите точку на луче, исходящем из точки глаза (и в вашем случае проходящем через вершину, на которую вы щелкнули),Значение z будет определять, где вы находитесь на этом луче.Вы почти гарантированно не вернете точку, по которой щелкнули.

Итак, вы хотите рассчитать этот луч (скажем, не проецируя две точки, такие как [x, y, 0,1] и [x], y, 1,1] и вычисление линии, на которой находятся непроецированные точки), а затем проверка, какая из ваших вершин лежит на этом луче.

Редактировать : Кроме того, вы хотитеубедитесь, что вы поделили первые три координаты world1 на четвертую координату.

...