вращение куба delphi

Я хочу повернуть куб на экране вокруг своей оси.

Я нашел этот пример в javascript, который использует матрицу вращения 3D. Я попытался сделать что-то подобное в своем приложении, но куб не хочет вращаться, и я не знаю, в чем проблема.

Куб перемещается в разных положениях (например, при просмотре под идеальным углом), но он не показывает движение до этого вида. Это что-то вроде вида сверху, снизу, спереди и сбоку.

Вот мой код:

dimension: Integer = 1;
a: Integer = 0;
b: Integer = 0;
ite: Integer = 27;
ite1: Integer;
ite2: Integer;
ite3: Integer;
x: Integer;
y: Integer;
z: Integer;
u: Integer = 0;
v: Integer = 0;
w: Integer = 0;
u2: Integer = 0;
v2: Integer = 0;
w2: Integer = 0;
c: Integer = 0;
pts: TpointArray;

ite := 0;
a := round(Mouse.CursorPos.X/99);
b := round(Mouse.CursorPos.Y/99);
for x := -dimension to dimension do
begin
  for y := -dimension to dimension do
  begin
    for z := -dimension to dimension do
    begin
      u := x;
      v := y;
      w := z;
      u2 := round(u*cos(a)-v*sin(a));
      v2 := round(u*sin(a)+v*cos(a));
      w2 := w;
      u := u2; v := v2; w := w2;
      u2 := u;
      v2 := round(v*cos(b)-w*sin(b));
      w2 := round(v*sin(b)+w*cos(b));
      u := u2; v := v2; w := w2;
      pts[ite].X := 200+u*(w+2)*30;
      pts[ite].Y := 200+v*(w+2)*30;
      Ellipse(pts[ite].X,pts[ite].Y,pts[ite].X+10,pts[ite].Y+10);
      ite := ite + 1;
    end;
  end;
end;

for ite1 := 0 to 25 do
begin
  for ite2 := 1 to 26 do
  begin
    MoveTo(pts[ite1].X,pts[ite1].Y);
    LineTo(pts[ite2].X,pts[ite2].Y);
  end;
end;

Где проблема?


person tzortzik    schedule 29.12.2012    source источник


Ответы (2)


Вы используете целые числа для обозначения углов. Функции cos и sin используют числа с плавающей запятой (радианы). Итак, в вашем случае углы поворота изменяются на ~ 57 градусов в отдельности.

person Dave    schedule 29.12.2012

Решение выглядит так:

a: Double = 0;
b: Double = 0;
ite: Integer = 27;
ite1: Integer;
ite2: Integer;
ite3: Integer;
x: Integer;
y: Integer;
z: Integer;
u: Double = 0;
v: Double = 0;
w: Double = 0;
u2: Double = 0;
v2: Double = 0;
w2: Double = 0;
c: Integer = 0;
pts: TpointArray;

ite := 0;
      a := Mouse.CursorPos.X/99;
      b := Mouse.CursorPos.Y/99;
      for x := -dimension to dimension do
      begin
        for y := -dimension to dimension do
        begin
          for z := -dimension to dimension do
          begin
            u := x;
            v := y;
            w := z;
            u2 := u*cos(a)-v*sin(a);
            v2 := u*sin(a)+v*cos(a);
            w2 := w;
            u := u2; v := v2; w := w2;
            u2 := u;
            v2 := v*cos(b)-w*sin(b);
            w2 := v*sin(b)+w*cos(b);
            u := u2; v := v2; w := w2;
            pts[ite].X := round(200+u*(w+5)*30);
            pts[ite].Y := round(200+v*(w+5)*30);
            Ellipse(pts[ite].X,pts[ite].Y,pts[ite].X+10,pts[ite].Y+10);
            ite := ite + 1;
          end;
        end;
      end;

      for ite1 := 0 to 25 do
      begin
        for ite2 := 1 to 26 do
        begin
           MoveTo(pts[ite1].X,pts[ite1].Y);
           LineTo(pts[ite2].X,pts[ite2].Y);
        end;
      end;
person tzortzik    schedule 30.12.2012