Как обнаружить столкновение в webgl? - PullRequest
6 голосов
/ 12 декабря 2011

Как обнаружить столкновение в webgl, без использования какой-либо библиотеки, такой как three.js?

Ответы [ 4 ]

13 голосов
/ 12 декабря 2011

Как обнаружить столкновение в webgl

Нет.WebGL, как и OpenGL, предназначен только для рисования.Он не управляет сценой, у него нет понятия «объекты» или такие вещи высокого уровня, как столкновения.Все дело в точках, линиях, треугольниках и шейдерах.

Все, что связано с управлением сценой или коллизиями, выходит за рамки WebGL (и OpenGL).

3 голосов
/ 12 декабря 2011

Простой подход к обнаружению столкновений лучей на GPU.Изучите следующий пост блога на эту тему.

http://blog.xeolabs.com/ray-picking-in-scenejs

Основная идея заключается в рендеринге сцены в текстуру (с использованием FBO) с использованием шейдера, который сохраняет идентификаторы объектов вместо цвета.Затем вы можете очень быстро выполнить поиск по этой текстуре, чтобы увидеть, с чем сталкивается луч.

1 голос
/ 18 января 2012

Я бы порекомендовал следующую веб-страницу (к сожалению, доступна только на немецком языке) http://www.peter -strohm.de / webgl / webgltutorial8.php

Мы смогли реализовать обнаружение столкновений и даже могли выполнять вызовы API на сервере, используя отображение идентификаторов (например, показывать всплывающие подсказки с дополнительной информацией для определенного объекта в сцене).

Надеюсь, это немного поможет.

1 голос
/ 13 декабря 2011

С воскресенья я пытаюсь решить ту же проблему. Хотя в интернете много информации, я не смог заставить ее работать над моей программой-примером. Как только я это решу, я опубликую свой пример здесь.

Моя последняя попытка состояла в том, чтобы использовать порт glu-unProject для webGL. Для этого нужны следующие параметры:

функция (winX, winY, winZ, модель, proj, просмотр, objPos)

Я пытался вызвать эту функцию напрямую из функции рисования сцены для тестирования.

var pMatrix  = new mat4.ortho(iL, iR, iB, iT, fNearZ, farZ);
var mvMatrix = new mat4.create();

mat4.identity(mvMatrix);
mat4.translate(mvMatrix,[0,0,-40]);

var oMouseMatrix = mat4.create();
mat4.identity(oMouseMatrix);

//Rotate eye :-S
mat4.rotate(oMouseMatrix,((this.fAnimationXAngle/10) * Math.PI) / 360.0,[0,1,0]);
mat4.rotate(oMouseMatrix,((this.fAnimationYAngle/10) * Math.PI) / 360.0,[1,0,0]);

mat4.multiply(oMouseMatrix, mvMatrix, mvMatrix);

//Rotate model
mat4.rotateX(mvMatrix,this.fRotX * Math.PI / 180.0);
mat4.rotateY(mvMatrix,this.fRotY * Math.PI / 180.0);
mat4.rotateZ(mvMatrix,this.fRotZ * Math.PI / 180.0);



var aTest = this.unProject(
    this.pLastMouse.x,
    this.pLastMouse.y,
    0,
    mvMatrix,
    pMatrix,
    [0,0,this.iWidth,this.iHeight]
);

this.iWidth & this.iHeight - это холст и ширина / высота области просмотра - this.pLastMouse.x & .y - координаты мыши внутри холста

zI.debug(aTest);

Но результат полностью дерьмо . Я думаю, в моем коде есть несколько ошибок. Я начал играть с WebGL только в прошлую пятницу. Я не хотел сдаваться так рано, но с тех пор я решил много проблем, но эта сводит меня с ума.

В openGL мне было намного проще.

...