Ответы пользователя по тегу WebGL
  • Как на WebGL сделать отображение точек с информацией на 3D модели?

    MrGobus
    @MrGobus
    Иван
    Схема примерно такая

    Часть первая : Определение координат точки.
    Raycasting (пересечение луча и модели) - позволяет найти ближайшую (иногда все) точки модели где луч ее пересек. Перебирает грани модели (обычно треугольники) и по сути сводится к задаче по пересечению луча и треугольника ноги которой растут к пересечению с плоскостью.
    Математика вопроса описана тут: www.ray-tracing.ru

    Обычно луч выпускается по клику мыши координаты которой браузер отдает относительно window (нам кстати надо относительно канвы, хе хе хе). Затем координаты клика переводим из пикселей в относительные (от -1 до 1), получаем 3D вектор добавив 1 по оси z, затем умножаем на инверсию произведения матриц проекции и камеры благодаря чему получаем вектор направления в мировых координатах и уже из него делаем raycating.

    Не забываем что координаты зачастую получаем в мировых координатах и их желательно перевести в локальные хотя задачи бывают разные.

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

    матрица проекции * матрица трансформации модели * координаты точки

    В некоторых зачах порядок матриц может меняться, например может быть добавлена матрица камеры, анимации и еще какие то преобразования. Кстати в разнообразных движках (например three.js) для подобных вычислений имеются уже готовые средства (но тут документация вам в помощь)

    В результате получим координаты от -1 до 1 и все что останется это понять где они на канве
    (v * 0.5 + 0.5) * canvaSize

    если непонятно то имеется в виду
    (v.x * 0.5 + 0.5) * c.width
    (v.y * 0.5 + 0.5) * c.height

    Теперь когда есть координаты все что осталось это нарисовать там что вам нужно и все =)
    Ответ написан
    Комментировать