c++builder - Код 3D фигуры на С++


0

Вот полный листинг программы

В итоге получается, вращающиеся красная звезда вслед за курсором. Написана без OpenGl.

Объясните мне пару моментов.

Имеется unit1.h в нем есть след. строки, и что они означают?

class TForm1 : public TForm
{
__published:
    TTimer *Timer1;
    void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y);
    void __fastcall FormMouseWheel(TObject *Sender, TShiftState Shift,
      int WheelDelta, TPoint &MousePos, bool &Handled);
 private:    // User declarations
 public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    void DrawPoints(); 
    SortTriangles();
    Graphics::TBitmap*BackBuffer;
  };

P.S. на форме есть таймер, который отвечает за вращение фигуры.

Далее для чего z-буфер? и вообще где про него почитать толковый материал?

Потом непонятно последние строчки в листинге, а именно эти:

void TForm1::DrawPoints()
{
TFPoint point1,point2,point3;
BackBuffer->Canvas->Brush->Color=clBlack;
BackBuffer->Canvas->FillRect(Form1->GetClientRect());
BackBuffer->Canvas->Brush->Color=clRed;
BackBuffer->Canvas->Pen->Color=clOlive;
BackBuffer->Canvas->Pen->Width=1;
TPoint p[3];

SortTriangles();

for(int i=0;i<TrCol;i++)
    {
            point1=XYZtoXY(StarPoints[Triangles[i].p1].X,StarPoints[Triangles[i].p1].Y,StarPoints[Tri angles[i].p1].Z);
      point2=XYZtoXY(StarPoints[Triangles[i].p2].X,StarPoints[Triangles[i].p2].Y,StarPoints[Triangles[i].p2].Z);
      point3=XYZtoXY(StarPoints[Triangles[i].p3].X,StarPoints[Triangles[i].p3].Y,StarPoints[Triangles[i].p3].Z);
    p[0].x=point1.X;
    p[0].y=point1.Y;

    p[1].x=point2.X;
    p[1].y=point2.Y;

    p[2].x=point3.X;
    p[2].y=point3.Y;
    BackBuffer->Canvas->Polygon(p,2);
    }
    Canvas->Draw(0,0,BackBuffer);
   }
   //---------------------------------------------------------------------------
 void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
  int X, int Y)
 {
 rotation-=(X-oldX)/50.0;
  plane-=(Y-oldY)/100.0;
 DrawPoints();
oldX=X;
oldY=Y;
}
//---------------------------------------------------------------------------
 void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift,
  int WheelDelta, TPoint &MousePos, bool &Handled)
{
distance+=WheelDelta/1000.0;
DrawPoints();
}
Источник
  •  264
  •  1
  • 4 янв 2012 2012-01-04 13:46:11

1 ответ

2

Что именно из этого - вам не понятно?

В .h файле традиционно идет инициализация формы.

Код во втором блоке отвечает за прорисовку с помощью "внеэкранного" (или двойного) буфера. И реакцию на шуршание мышки.

Z-буфер - это буфер глубины. Это когда для каждой точки экрана считается как далеко то, что на ней нарисовано "от экрана". Тут его как такового и нет.

Собственно самое интересное вы тут как раз и не показали:

  1. Формулы пересчета из "3D в 2D" .
  2. Метод сортировки треугольников так, чтобы более дальние рисовались раньше, чем более близкие (бо иначе какашка получится).
  • 4 янв 2012 2012-01-04 18:58:10
XYZtoXY(x,y,z) — 5 янв 20122012-01-05 04:42:25.000000
Формулы пересчета из "3D в 2D". ? — 4 янв 20122012-01-04 19:09:31.000000