- 14 Tháng năm 2017
- 3,974
- 7,619
- 744
- 21
- Phú Yên
- Trường THPT Lương Văn Chánh
Chắc suất Đại học top - Giữ chỗ ngay!! ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.
Code đây nè, chỉ là cho biết cảm giác 3D thôi nên có xấu thông cảm nha. Chạy trên Dev C++, phần mềm khác lỗi ráng chịu
Mã:
#include<graphics.h>
#include<conio.h>
#include<dos.h>
#include<iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
float camD = 0.84;
int roadW = 300, heigh = 480, width = 640, segL = 100;
struct TLine
{
float x,y,z;
float X,Y,W;
float scale;
void project(int camX,int camY,int camZ)
{
if (z - camZ == 0) z = camZ + 1;
scale = camD / (z - camZ);
X = (1 + scale*(x- camX))*width/2;
Y = (1 - scale*(y- camY))*heigh/2;
W = scale*roadW*width/2;
}
};
void DrawQuad(int color,int x1,int y1,int w1,int x2,int y2,int w2)
{
setcolor(color);
setfillstyle(1,color);
int p[10] = {x1-w1,y1,x1+w1,y1,x2+w2,y2,x2-w2,y2,x1-w1,y1};
fillpoly(5,p);
}
main()
{
int gd = DETECT, gm = VGA;
initgraph(&gd, &gm, "C:\\TC\\BGI");
int camX = 0, camY = 750, camZ = 0;
long count = 10000;
while (true)
{
TLine l,p;
for (int i = 1;i < count;i++)
{
if (i < (camZ / segL) + 70)
{
if (i > 1)
p = l;
l.x = 0;
l.z = i*segL;
l.y = heigh/2+50;
l.project(camX,camY,camZ);
if (i > 1 && p.z >= camZ)
{
if (i % 2 == 0)
DrawQuad(2,p.X,p.Y,width,l.X,l.Y,width);
else
DrawQuad(10,p.X,p.Y,width,l.X,l.Y,width);
if (i % 2 == 0)
DrawQuad(15,p.X-p.W*1.1,p.Y,p.W / 8,l.X - l.W*1.1,l.Y,l.W/8);
else
DrawQuad(6,p.X-p.W*1.1,p.Y,p.W / 8,l.X - l.W*1.1,l.Y,l.W/8);
if (i % 2 == 0)
DrawQuad(15,p.X+p.W*1.1,p.Y,p.W / 8,l.X + l.W*1.1,l.Y,l.W/8);
else
DrawQuad(6,p.X+p.W*1.1,p.Y,p.W / 8,l.X + l.W*1.1,l.Y,l.W/8);
DrawQuad(8,p.X,p.Y,p.W,l.X,l.Y,l.W);
}
}
else break;
}
int key;
key = getch();
switch(key)
{
case 72: camZ+= segL / 4;break;
case 77: camX-= 200;break;
case 75: camX+= 200; break;
}
}
getch();
closegraph();
}