Лучше в виде конкурса всё делать, конкурс на лучший 3D шутер. Сумма наверно должна быть по крайней мере не меньше чем призовой фонд RGB-2014.
Вид для печати
ZX_NOVOSIB, 3д Шутер на спек? ты наверное шутишь
даже при 8 фпс он не будет динамичным.
я бы рекомендовал РПГ или чтото подобное не слишком ориентированное на реакцию.
а кроме тото что не делай - получится Wolf3d
Вообщем больше разговоров, чем дела. Перевести исходники на сжасм не деле вопрос одного вечера.
Вложение 54776
Дубль
Макрос 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) с той же точностью в данном случае.