Tin học Hiệu ứng 3D viết bằng C++

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,619
744
21
Phú Yên
Trường THPT Lương Văn Chánh
[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
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 :D
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();
}
 
Top Bottom