ZX_NOVOSIB, 3д Шутер на спек? ты наверное шутишь
даже при 8 фпс он не будет динамичным.
я бы рекомендовал РПГ или чтото подобное не слишком ориентированное на реакцию.
а кроме тото что не делай - получится Wolf3d
С уважением,
Jerri / Red Triangle.
Свирепый агрессивно-депрессивный мордовец!
Не уверен - не напрягай!
Не сдавайся. Дыши?
Virtual TR-DOS
Свирепый агрессивно-депрессивный мордовец!
Не уверен - не напрягай!
Не сдавайся. Дыши?
Virtual TR-DOS
Вообщем больше разговоров, чем дела. Перевести исходники на сжасм не деле вопрос одного вечера.
Wolf483 sjasm.rar
Дубль
Макрос RAY раскрыт
Автогенерация таблиц при компиляции переписана на Lua
на самом деле макрос не нужно было раскрывать. версия выше прикреплённая с этим макросом прекрасно справляется. хотя вот для jerri и Destr`а оно будет полезным, наверное.
У меня же пока совсем другие вопросы. Например, есть два основных материала по теме рейкаста:
1. http://zxpress.ru/article.php?id=8482 (тут просто читаемость лучше, чем на zxdn)
2. http://permadi.com/1996/05/ray-casti...e-of-contents/
собственно говоря, первый составлен на основе второго. при этом есть ещё и:
3. http://lodev.org/cgtutor/raycasting.html
подходы в них кажутся разными и в то же время одинаковыми. Если следовать материалам permadi, то там многовато процедур получается, не факт что быстро. Но при этом, я встал на теме синусов и тангенсов. Да да, в школе я часто прогуливал уроки... Во всех материалах требуется работа с float/double. допустим, я напилил табличку тангенсов (для Xa=64/tan(угол луча) ):
табличка с данными в 16 бит (не страшно). А вот что с этими данными дальше делать, если всё и везде float?Код:fprintf(out, "\n\n\nTan256Table:\n"); for(k = 0; k <= 180; k++) { if((k % 8) == 0) fprintf(out, "\n dw "); else fprintf(out, ","); temp = 64 / fabs(tan(k * (PI / 180))); fprintf(out, "%5.0d", (int)temp); }
О!!! Крутяк!!!
Использовать fixed point. Например: 192 * sin (45°) = 192 * sin(45/360 * pi) = 192 * sin(32/256 * pi) = 192 * 0,70710678118654752440084436210485 = 192 * 256 * SIN_TABLE[32] / 256 = high(192 * 181) = 135 c точностью 1 (136 с точностью 0,5, если сделать округление по старшему биту млпдшего байта) Точка сдвигается на 8 бит делением на 256: xxxxxxxxxxxxxxxx => xxxxxxxx.xxxxxxxx. Точку не обязательно двигать именно на 8 бит, можно и на больше, можно и на меньше, можно и вправо для больших чисел, можно вообще для разных этапов расчета двигать в разное место. Скажем, если делать вывод по высоте в 2/3 экрана (128 точек), то 7-битной таблицы для расчета по Y будет вполне достаточно, а 7-битное умножение более, чем на 1/8 дешевле 8-битного (за вычетом 4-х тактов на add a,a) с той же точностью в данном случае.
ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)