Создайте две параллельные плоскости по трем точкам (Javascript)

Я пытаюсь создать продвинутый raycaster. Как мне написать функцию, которая создаст две сетки (изображение здесь) на основе 3 точки? Я хочу, чтобы на выходе были два массива, заполненные объектами {x: 0, y: 0, z: 0} для каждого пересечения, показанного на изображении. Надеюсь, это не слишком сложно для понимания. Причина, по которой я хочу этого, заключается в том, что я могу получать лучи от каждого пикселя на экране.


person Invincible Blaze    schedule 23.01.2017    source источник
comment
dotproduct и crossproduct — ваши друзья.   -  person CascadeCoder    schedule 23.01.2017


Ответы (1)


Пусть вектор c=CB, вектор a=AB. Вы можете получить второй базовый вектор для самолетов как

d = c X a  (cross product)

получить единичные базовые векторы

ua = Normalized(a) = a / Length(a)
ud = Normalized(d) 

и построить сетку (размер ячейки ASize x DSize) точек как

P[i,j] = B + ua * i * ASize + ud * j * DSize
   for the first plane

Q[i,j] = C + ua * i * ASize + ud * j * DSize
   for the second plane
person MBo    schedule 23.01.2017
comment
Можете ли вы более подробно объяснить последний блок кода? В JavaScript есть P(i,j) два цикла внутри друг друга? - person Invincible Blaze; 23.01.2017
comment
Да, 2d-массив с вершинами сетки может быть заполнен в два цикла (for i... for j.... P[i,j]=...) - person MBo; 23.01.2017
comment
Если бы я хотел, чтобы на выходе был массив {x: 0, y: 0, z: 0}, что бы я поставил вместо 'B + ua * i * ASize + ud * j * DSize' - person Invincible Blaze; 27.01.2017
comment
покомпонентные выражения, такие как x = B.X + ua.X * i * ASize + ud.X * j * DSize - person MBo; 27.01.2017
comment
В каком порядке будет строиться сетка? Я зациклился на сетке 1, и в зависимости от того, было ли пересечение между (sphere.pos, сфера.радиус, this.raycastGrids.grid1[i], this.raycastGrids.grid2[i], пересечение), я нарисовал черный круг at var xDraw = i % this.width; var yDraw = Math.floor(i/this.width);. Однако это не сработало, оно только нарисовало много линий разной длины. - person Invincible Blaze; 27.01.2017
comment
Для рисования сетки можно провести линии между P[i,j] и P[i,j+1] (в 2d - вправо), а также между P[i,j] и P[i+1,j ] (в 2д - до нижней точки) - person MBo; 27.01.2017
comment
Подождите, так вывод в форме [[1,2,3],[4,5,6]] относительно сетки? - person Invincible Blaze; 28.01.2017
comment
Я не понимаю... Пример 2D: формула генерирует точки (0,0), (0,1),(0,2)..(1,0),(1,1),(1,2) ... Линии сетки (0,0)-(0,1) и (0,0)-(1,0) и т. д. - person MBo; 28.01.2017
comment
Извините, я не понимаю, что вы говорите. Что именно вы подразумеваете под 2D-примером? Это 3D игра. Мой вывод для этой функции — это два массива, такие как [tuple1a, tuple2a, tuple3a, tuple4a] и [tuple1b, tuple2b, tuple3b, tuple4b]. Я привожу векторы, начиная с tuple1a, которые пересекают tuple1b. Если они пересекаются, я рисую на холсте черный квадрат. Это правильное использование вашей формулы? - person Invincible Blaze; 28.01.2017
comment
Потому что пример для 2D прост. - person MBo; 28.01.2017
comment
2D просто продемонстрировать, но техника такая же - для 3D мы просто добавляем 3-ю координату. Мне непонятно - для чего предназначены кортежи? Они содержат координаты? Координаты каких объектов? - person MBo; 28.01.2017