Я пытаюсь создать Voxel Space Engine в SDL2 C++. В учебнике, которому я следую, считываются пиксели X и Y изображения карты высот. Но я не могу найти способ сделать это. Я следую этому руководству:
https:/ /github.com/s-macke/VoxelSpace Код из руководства:
def Render(p, height, horizon, scale_height, distance, screen_width, screen_height):
# Draw from back to the front (high z coordinate to low z coordinate)
for z in range(distance, 1, -1):
# Find line on map. This calculation corresponds to a field of view of 90°
pleft = Point(-z + p.x, -z + p.y)
pright = Point( z + p.x, -z + p.y)
# segment the line
dx = (pright.x - pleft.x) / screen_width
# Raster line and draw a vertical line for each segment
for i in range(0, screen_width):
height_on_screen = (height - heightmap[pleft.x, pleft.y]) / z * scale_height. + horizon
DrawVerticalLine(i, height_on_screen, screen_height, colormap[pleft.x, pleft.y])
pleft.x += dx
# Call the render function with the camera parameters:
# position, height, horizon line position,
# scaling factor for the height, the largest distance,
# screen width and the screen height parameter
Render( Point(0, 0), 50, 120, 120, 300, 800, 600 )
#include
#include
#include
using namespace std;
int main(){
SDL_Init(SDL_INIT_VIDEO);
IMG_Init(IMG_INIT_PNG);
SDL_Window* window = SDL_CreateWindow("Voxel Space", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
int w = 640;
int h = 480;
int pixelX = 0;
int pixelY = 0;
int renderDistance = 1;
bool quit = false;
SDL_Surface* cm = IMG_Load("colormap.png");
SDL_Surface* hm = IMG_Load("heightmap.png");
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
while(quit){
SDL_Event e;
while(SDL_PollEvent(&e)){
if(e.type == SDL_QUIT){
quit == true;
}
}
SDL_RenderClear(renderer);
for(int z = 128; z > renderDistance; z--){
int pixelLeftX = (-z + pixelX);
int pixelLeftY = (-z + pixelY);
int pixelRightX = (z + pixelX);
int pixelRightY = (-z + pixelY);
double dx = (pixelRightX - pixelLeftX) / w;
for(int i = 0; i < w; i++){
double hm.x = pixelLeftX;
double hm.y = pixelLeftY;
heightOnScreen = (50 - hm.xy) / z * h + 120;
for(int y = 0; y < i; y++){
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 0);
SDL_RenderDrawPoint(renderer, heightOnScreen, w);
pixelLeftX += dx;
}
}
}
SDL_RenderPresent(renderer);
}
return 0;
}
Я пытался получить значения X и Y SDL Surface и попытался сохранить их в массиве, чтобы он мог перебирать массив и получать пиксели вручную, но это не сработало, потому что Я вообще даже не знаю, как получить пиксели по осям.
Как я могу получить пиксели X и Y изображения карты высот в SDL2?
Я пытаюсь создать [b]Voxel Space Engine[/b] в [b]SDL2 C++[/b]. В учебнике, которому я следую, считываются пиксели X и Y изображения карты высот. Но я не могу найти способ сделать это. [b]Я следую этому руководству:[/b] https:/ /github.com/s-macke/VoxelSpace [b]Код из руководства:[/b] [code] def Render(p, height, horizon, scale_height, distance, screen_width, screen_height):
# Draw from back to the front (high z coordinate to low z coordinate)
for z in range(distance, 1, -1): # Find line on map. This calculation corresponds to a field of view of 90° pleft = Point(-z + p.x, -z + p.y) pright = Point( z + p.x, -z + p.y) # segment the line dx = (pright.x - pleft.x) / screen_width # Raster line and draw a vertical line for each segment for i in range(0, screen_width): height_on_screen = (height - heightmap[pleft.x, pleft.y]) / z * scale_height. + horizon DrawVerticalLine(i, height_on_screen, screen_height, colormap[pleft.x, pleft.y]) pleft.x += dx
# Call the render function with the camera parameters: # position, height, horizon line position, # scaling factor for the height, the largest distance, # screen width and the screen height parameter Render( Point(0, 0), 50, 120, 120, 300, 800, 600 ) [/code] [b]Мой код:[/b] [code]#include #include #include
using namespace std;
int main(){ SDL_Init(SDL_INIT_VIDEO); IMG_Init(IMG_INIT_PNG); SDL_Window* window = SDL_CreateWindow("Voxel Space", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); int w = 640; int h = 480; int pixelX = 0; int pixelY = 0; int renderDistance = 1; bool quit = false; SDL_Surface* cm = IMG_Load("colormap.png"); SDL_Surface* hm = IMG_Load("heightmap.png"); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); while(quit){ SDL_Event e; while(SDL_PollEvent(&e)){ if(e.type == SDL_QUIT){ quit == true; } } SDL_RenderClear(renderer); for(int z = 128; z > renderDistance; z--){ int pixelLeftX = (-z + pixelX); int pixelLeftY = (-z + pixelY); int pixelRightX = (z + pixelX); int pixelRightY = (-z + pixelY); double dx = (pixelRightX - pixelLeftX) / w; for(int i = 0; i < w; i++){ double hm.x = pixelLeftX; double hm.y = pixelLeftY; heightOnScreen = (50 - hm.xy) / z * h + 120; for(int y = 0; y < i; y++){ SDL_SetRenderDrawColor(renderer, 0, 255, 0, 0); SDL_RenderDrawPoint(renderer, heightOnScreen, w); pixelLeftX += dx; } } } SDL_RenderPresent(renderer); } return 0; } [/code] Я пытался получить значения X и Y SDL Surface и попытался сохранить их в массиве, чтобы он мог перебирать массив и получать пиксели вручную, но это не сработало, потому что Я вообще даже не знаю, как получить пиксели по осям. Как я могу получить пиксели X и Y изображения карты высот в SDL2?