Написать формулы - не вопрос (надеюсь, бейсиковская "грамматика" знакома): ------------------------------------------------------------ For x = 0 To 255 'подсчёт горизонта x1 = CInt(127.5 + Atn(x / 127.5 - 1) * 162.6564) For y = 0 To 255 y1 = CInt(127.5 + Atn((y - 127.5) * Cos(Atn(x / 127.5 - 1)) / 127.5) * 162.6564) art(x, y) = 55 + (y1 + 128) * 3072 + x1 * 3 Next y Next x For y = 0 To 127 'подсчёт полюсов For x = y To 254 - y x1 = CInt(127 + Atn((x - 127) / (128 - y)) * 161.701) y1 = CInt(Atn(Sqr((127 - y) ^ 2 + (127 - x) ^ 2) / 127) * 161.701) adn(x, 255 - y) = 55 + y1 * 3072 + x1 * 3 adn(255 - y, 255 - x) = 55 + y1 * 3072 + x1 * 3 + 768 adn(255 - x, y) = 55 + y1 * 3072 + x1 * 3 + 1536 adn(y, x) = 55 + y1 * 3072 + x1 * 3 + 2304
aup(1 + x, 255 - y) = 55 + (511 - y1) * 3072 + (255 - x1) * 3 + 1536 aup(255 - y, 254 - x) = 55 + (511 - y1) * 3072 + (255 - x1) * 3 + 768 aup(254 - x, y) = 55 + (511 - y1) * 3072 + (255 - x1) * 3 aup(y, x + 1) = 55 + (511 - y1) * 3072 + (255 - x1) * 3 + 2304 Next x Next y ------------------------------------------------------------ Здесь art, adn, aup - массивы (ага, Matrix'ы, родные), размером 256 на 256 элементов - собственно, "карты" соответствия точек граней SkyBox'a и точек первичной панорамы. X и Y - переменные (от 0 до max 255), в общем случае - координаты подсчитываемой точки на грани SkyBox'a. X1 и Y1 - координаты точки фрагмента первичной панорамы, соответствующей подсчитываемой точке (как бы сложно это не звучало, но на слово "фрагмента" советую обратить особое внимание). Ну, что ещё помню: часто там число 55 мелькает (кстати, специально написал отдельно, хотя в некоторых местах можно было и пооптимизировать формулы) - это чисто для пропуска первых 54 байт (headera) в BMP картинке.
А вот описать что там ещё к чему и почему... Боюсь, куча времени уйдёт пока вспомню, а потом ещё выразить мысль умными словами, да настучать на клаве - не, sorry.
------------------------------------------------------------
For x = 0 To 255 'подсчёт горизонта
x1 = CInt(127.5 + Atn(x / 127.5 - 1) * 162.6564)
For y = 0 To 255
y1 = CInt(127.5 + Atn((y - 127.5) * Cos(Atn(x / 127.5 - 1)) / 127.5) * 162.6564)
art(x, y) = 55 + (y1 + 128) * 3072 + x1 * 3
Next y
Next x
For y = 0 To 127 'подсчёт полюсов
For x = y To 254 - y
x1 = CInt(127 + Atn((x - 127) / (128 - y)) * 161.701)
y1 = CInt(Atn(Sqr((127 - y) ^ 2 + (127 - x) ^ 2) / 127) * 161.701)
adn(x, 255 - y) = 55 + y1 * 3072 + x1 * 3
adn(255 - y, 255 - x) = 55 + y1 * 3072 + x1 * 3 + 768
adn(255 - x, y) = 55 + y1 * 3072 + x1 * 3 + 1536
adn(y, x) = 55 + y1 * 3072 + x1 * 3 + 2304
aup(1 + x, 255 - y) = 55 + (511 - y1) * 3072 + (255 - x1) * 3 + 1536
aup(255 - y, 254 - x) = 55 + (511 - y1) * 3072 + (255 - x1) * 3 + 768
aup(254 - x, y) = 55 + (511 - y1) * 3072 + (255 - x1) * 3
aup(y, x + 1) = 55 + (511 - y1) * 3072 + (255 - x1) * 3 + 2304
Next x
Next y
------------------------------------------------------------
Здесь art, adn, aup - массивы (ага, Matrix'ы, родные), размером 256 на 256 элементов - собственно, "карты" соответствия точек граней SkyBox'a и точек первичной панорамы. X и Y - переменные (от 0 до max 255), в общем случае - координаты подсчитываемой точки на грани SkyBox'a. X1 и Y1 - координаты точки фрагмента первичной панорамы, соответствующей подсчитываемой точке (как бы сложно это не звучало, но на слово "фрагмента" советую обратить особое внимание). Ну, что ещё помню: часто там число 55 мелькает (кстати, специально написал отдельно, хотя в некоторых местах можно было и пооптимизировать формулы) - это чисто для пропуска первых 54 байт (headera) в BMP картинке.
А вот описать что там ещё к чему и почему... Боюсь, куча времени уйдёт пока вспомню, а потом ещё выразить мысль умными словами, да настучать на клаве - не, sorry.
Reply
Бейсик мне понятен, я с него начал изучение праграмирования. :)
Reply
Leave a comment