Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Воксельный ландшафт

47K
08 марта 2009 года
hitan
2 / / 07.03.2009
прочитал статью http://www.codenet.ru/progr/video/voxel/index.php

реализовал вот эту функцию

void cast_ray(int scrx,real x,real y,real dx,real dy) {
max_height=0;
for(dist=0;dist<view_depth;dist++) { // ограничение по дальности
h=fetch_height(x,y); // взять высоту из карты высот
scrh=height_to_screen(h,dist); // преобразовать высоту в экранную
if(scrh>max_height){ // текущий столбец "выше"
// самого высокого отрисованого
color=fetch_color(x,y);
draw_column(scrx,max_height,height,color); // отрисовать видимую часть
max_height=height;
}
x=x+dx; // единичный шаг вперед, вдоль луча
y=y+dy;
}
}

сделал наблюдателя который ходит по ландшафту и поворачивается вправо влево (вокруг оси Z)
вопрос: как реализовать повороты вверх вниз (вокруг оси x) например как в Delta Force?:confused:
391
08 марта 2009 года
Archie
562 / / 03.02.2005
При повороте вверх/вних преобразовывай проекцию h на экранную плоскость соответственно.
47K
10 марта 2009 года
hitan
2 / / 07.03.2009
сейчас вот такие функции у меня

int fetch_height(int x, int y) //высота из карты высот
{
return map[(((int)y)*256+((int)x))&65535];
}

int height_to_screen(h,dist) //проецирование на экран
{
int a=(h-сZ)*scale/dist+screen_Height_half;
return a;
}

// screen_Height_half - половина высоты экрана
// h - высота текселя
// сZ - высота наблюдателя
// scale - масштабирование высоты
// dist - расстояние до текселя

пробовал вертеть (h-сZ) вместе с dist ...
rot_dist=dist*cos(rot_x)-(h-сZ)*sin(rot_x);
rot_scr_h=dist*sin(rot_x)+(h-сZ)*cos(rot_x);
какая-то каша получается...:(

может нужно вычислять реальное расстояние до текселя c учётом высоты? исходя из (h-сZ) и dist (D^2=dist^2 + (h-сZ)^2) тогда корень^2 нужно будет применять...
может это только raytracing-гом можно сделать?

подскажите что не так? :confused:
391
10 марта 2009 года
Archie
562 / / 03.02.2005
Ты слишком просто проектируешь на экран. У тебя есть точка в пространстве с координатами {x, y, fetch_height(x, y)}, и тебе ее нужно проектировать на экранную плоскость (см. http://www.cse.unr.edu/~bebis/CS791E/Notes/PerspectiveProjection.pdf для примера). Поскольку ты рисуешь линию от точки проекции вниз экрана, то большие углы наклона камеры быдут приводить к искажениям.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог