PDA

Просмотр полной версии : Билборды в трëхмерном пространстве.



ALKO
10.02.2021, 19:47
Допустим, есть у меня процедура скейла спрайта условная SpriteScale(*img, X,Y, zoom)
Как корректнее подготовить параметры X, Y, Zoom для имитации поворота камеры на 360 градусов, а также перемещения еë в пределах одной плоскости (входящие параметры camPosX, camPosY, camAngle). В общем, как в вульфе/думе, только без учëта рендеринга стен, интересуют исключительно спрайты. Алгоритм сортировки не важен.
Желательно пояснение высокоуровневым псевдо-кодом.

NEO SPECTRUMAN
10.02.2021, 20:46
Допустим
несколько не ясно
тебе нужно подобрать масштаб спрайта в зависимости от угла поворота игрока\положения спрайтов на экране?

тода тебе нужен тот же cos a (где a угол пуляния луча оно же некоторое фиксированное значения для каждого столбца экрана)
который ты используешь для коррекции полученных длин перед выплевыванием на экран
ага по моему тебе нужно все и сразу

ALKO
10.02.2021, 20:54
Коррекция масштаба не нужна. Скейл будет пререндеренным. (Передаются числа от 1.. до N, и в зависииости от этого выбирается мип-мапа)
Куда больше интересует именно позиционирование.

NEO SPECTRUMAN
10.02.2021, 21:02
ну как правильно вычислять я не уверен

но можно посчитать так

найти разницу в координатах между камерой и спрайтом dX dY

дальше находим растояние до спрайта
L = sqr(dX^2+dY^2)

дальше находим угол между игроком и спрайтом относительно всей карты
arctan (dX/dY) (arctan это типа арктангенс чот не могу сспомнить как он пишотсо)
не сложно догадатсо что процедура arctan может выдавать ответ в пикселях а не в мерзских углах

дальше уже добавлем текующих угол камеры
и смотрим попадает ли спрайт в видимый сектор или нет

угол это X на экране
растояние еще наверно ноужно будет скорректировать косинуосом угла камеры и можно выплевывать на экран
(если не скорректировать спрайт при вращении камеры будут тупо двигаться не меняя размера и это будет выглядить как унылоегуафно уныло и не перспективно
но коррекция делается быстро даже по меркам chip8 : )
https://jpegshare.net/images/3c/f5/3cf5aed04455f199ecfee34b02e5070a.png


для Y проделать все тоже самое или центровать по центру если его нет...

ну а сортировать можно по еще не скорректированному L
и выводить от меньшего к большего
что даст нужное перекрытие одного другим

Bolt
10.02.2021, 21:20
дальше находим угол между игроком и спрайтом относительно всей карты
ctan (dX/dY) (ctan это типа котангенс чот не могу сспомнить как он пишотсо)

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

Но можно проще.
"найти разницу в координатах между камерой и спрайтом dX dY", а потом повернуть на угол поворота камеры игрока:
x = dx*cos(a) - dy*sin(a)
y = dx*sin(a) + dy*cos(a)
(ну, мож что-то инвертировать надо, не помню)
"и смотрим попадает ли спрайт в видимый сектор или нет"

NEO SPECTRUMAN
10.02.2021, 21:22
Нужен не котангенс, а арктангенс
до именно он
очепятко\оговорка
поправил

- - - Добавлено - - -

у меня на калькуляторе он записан как tan^(-1) :)

shurik-ua
11.02.2021, 07:43
вот (https://compgraphics.info/3D/3d_affine_transformations.php)