1

ユーザーが LMB を押したままマウスを動かすと、立方体が回転します。ダミーを一種の「アンカー」として使用しているため、カメラは同じ場所に留まりますが、オブジェクトは回転するため、すべての面がオブジェクト (立方体) を回転させます。問題は、オブジェクトを回転させた後、その x と y が一定のままであるため、同じ動きがカメラの視点から異なる効果を引き起こすことです。たとえば、上 (y) に 180 度回転すると、x 軸の回転がミラーリングされます。マウスを左に動かすと、180 度回転する前とは反対方向に回転します。

これが私のコードです:

フォーム作成:

procedure TForm2.Form3DCreate(Sender: TObject);
begin
Xf := 0;
Yf := 0;
Xi := 0;
Yi := 0;
Xd := 0;
Yd := 0;
end;

スタートボタン:

procedure TForm2.btnStartClick(Sender: TObject);    
begin
layerStart.Visible := False;
Controller := TController.create(Form2,10);
Camera1 := TCamera.Create(Controller.getAnchor);
Camera1.Parent := Controller.getAnchor;
Anchor := Controller.getAnchor;
Timer1.Enabled := True;

end;

オブジェクトと「アンカー」の作成:

Type
 tController = class
   private
     cubeArray : Array[1..10,1..10,1..10]  of TCube;
     fCubeCount, fHalf : integer;
     fForm : TForm3D;
     bigCube : tDummy;
   public
    constructor create(Form : TForm3D; cubeCount :integer);
    function getAnchor : tDummy;

 end;

implementation

{ tController }

constructor tController.create(Form: TForm3D; cubeCount: integer); //cubeCount Max 10, min 1
var
  x, y, z : Integer;
begin
fCubeCount := cubeCount;
fForm := Form;
fHalf := cubeCount div 2;
bigCube := TDummy.Create(Form);
With bigCube do
         begin
           Visible := True;
           Position.X := 0;
           Position.Y := 0;
           Position.Z := 0;
           Parent := Form;
         end;

for x := 1 to fCubeCount do
 begin
  for y := 1 to fCubeCount do
   begin
    for z := 1 to fCubeCount do
     begin
       CubeArray[x,y,z] := TCube.Create(bigCube);
        With CubeArray[x,y,z] do
         begin
           Visible := True;
           Width := 0.5;
           Height := 0.5;
           Depth := 0.5;
           Position.X := x - 0.5 - fHalf;
           Position.Y := y - 0.5 - fHalf;
           Position.Z := z - 0.5 - fHalf;
           Parent := bigCube;
         end;
        end;
    end;
   end;

 end;

function tController.getAnchor: TDummy;
begin
result := bigCube;
end;



end.

タイマー:

procedure TForm2.Timer1Timer(Sender: TObject);
begin

// X on Form to Left = 60; X on form to right = 1280
  while GetAsyncKeyState(VK_LBUTTON) = -32768  do
   begin
    Xi := Screen.MousePos.X;
    Yi := Screen.MousePos.Y;
    Sleep(1);
    Xf := Screen.MousePos.X;
    Yf := Screen.MousePos.Y;

    Xd := (Xi-Xf);
    Yd := (Yi-Yf)*-1;// *-1 for compliance with Cartesian plane logic

    Xd := (Xd / 1220)*360*10; //COnverting from X units to degrees, *10 for more rotation per amount moved by mouse
    Yd := (Yd / 1220)*360*10;


Anchor.RotationAngle.Y := Anchor.RotationAngle.Y + Xd;
Anchor.RotationAngle.X := Anchor.RotationAngle.X + Yd;
Application.ProcessMessages;

   end;


   end;

回転させたいオブジェクトは、すべての小さな立方体で構成される立方体です。私の知る限り、この問題は、回転後にアンカーが立方体に対して同じままであるという事実に起因します。つまり、回転の原点が回転するオブジェクトとともに移動します。どうすればこれを修正できますか?

4

0 に答える 0