Воксельный ландшафт
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:
прочитал статью
реализовал вот эту функцию
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:
При повороте вверх/вних преобразовывай проекцию h на экранную плоскость соответственно.
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:
http://www.cse.unr.edu/~bebis/CS791E/Notes/PerspectiveProjection.pdf для примера). Поскольку ты рисуешь линию от точки проекции вниз экрана, то большие углы наклона камеры быдут приводить к искажениям.
Ты слишком просто проектируешь на экран. У тебя есть точка в пространстве с координатами {x, y, fetch_height(x, y)}, и тебе ее нужно проектировать на экранную плоскость (см.