Fire Monkey 3D で作成した Shape を回転させるには?

解決


Patlice2011  2012-09-16 08:44:48  No: 42922

Fire Monkey 3D で、Form を作成し、ツールパレットから
3D Shapes の TRoundCube を Form に貼り付けます。
(ここまでは自分でできます)

マウスの左ボタンをシングルクリックしたら、TRoundCube が、
Y軸を軸にして90度回転させるにはどういうコードを書けば
いいでしょうか。
初心者ですので詳しく教えて頂けないでしょうか。

詳しい方がいらっしゃいましたらご指導の程よろしくお願い致します。


DEKO  2012-09-16 09:09:05  No: 42923

90度だと回転してるかどうか判りにくいので 45度で。

procedure TForm1.RoundCube1Click(Sender: TObject);
begin
  RoundCube1.RotationAngle.Y := RoundCube1.RotationAngle.Y + 45;
end;

[ダ○ボー サンプルソースコード]
http://ht-deko.minim.ne.jp/software/danboard.zip

[右手座標系 サンプルソースコード]
http://ht-deko.minim.ne.jp/software/righthandrule.zip

[FireMonkey [3D Shapes] Demo (Youtube)]
http://www.youtube.com/watch?v=UHmYKVz_oME


DEKO  2012-09-16 09:11:34  No: 42924

> 初心者ですので
FireMonkey に関しては誰だって素人だと思いますよ。


DEKO  2012-09-16 09:13:22  No: 42925

×: 素人
○: 初心者


patlice2011  2012-09-16 22:18:28  No: 42926

ありがとうございました。
できました。ありがとうございました。
もう1ついいでしょうか。
このコードですと、マウスを
TRoundCube上にマウスを置かないと
動きません。
TRoundCube上でなくForm上にマウスがあって、
マウスの左ボタンをシングルクリックしたらY軸を軸に
45°TRoundCubeを回転させるには
どうコードを書けばいいでしょうか。
ご指導の程よろしくお願い致します。


Mr.XRAY  2012-09-17 03:54:34  No: 42927

こんにちは.

>マウスの左ボタンをシングルクリックしたらY軸を軸に

シングルクリックというのは,OnClick イベントということになります.
しかし,OnClick イベントだと,マウスボタンの左右とかを判定する引数があません.
そこで,OnMouseDown や OnMoseUp イベントで処理することが多いようです.

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  if Button = TMouseButton.mbLeft then begin
    // 処理
  end;
end;

XE 2 の FireMonkey には OnClick はありません.XE3 は知りません
質問の時は,自分の環境を書きましょうね

今回は,処理コードは,既に DEKOさんが示しています.
だから,「シングルクリックのコード」の問題だと思います.
何がわからないのかを,分析して,ハッキリさせることが問題解決の一歩だと思います.


DEKO  2012-09-17 03:55:05  No: 42928

> このコードですと、マウスをTRoundCube上にマウスを置かないと動きません。
...そうですね。

1.TRoundCube の HitTest プロパティを False にする。
2.Form の OnMousedown イベントハンドラを以下のように記述する。

procedure TForm1.Form3DMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  if (Button = TMouseButton.mbLeft) then
    RoundCube1.RotationAngle.Y := RoundCube1.RotationAngle.Y + 45;
end;

HitTest についてはこちらを参照の事。

[画像付きのボタンは? (Delphi FireMonkey Tips)]
http://ht-deko.minim.ne.jp/techf007.html


Mr.XRAY  2012-09-17 04:08:29  No: 42929

もしかしたら,シングルクリックの動作に近いのは,
OnMouseUp かも知れませんね.


DEKO  2012-09-17 18:25:33  No: 42930

> もしかしたら,シングルクリックの動作に近いのは,
> OnMouseUp かも知れませんね.
ですね。
以下に、OnClick に似た実装を書いておきます。

  private
    { private 宣言 }
    FPoint: TPointF;

...

procedure TForm1.Form3DMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  FPoint.X := X;
  FPoint.Y := Y;
end;

procedure TForm1.Form3DMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var
  dPoint: TPointF;
  function CalcDist(a, b: TPointF): Single;
  begin
    result := Sqrt(Sqr(a.X - b.X) + Sqr(a.Y - b.Y));
  end;
begin
  if (Button = TMouseButton.mbLeft) then
    begin
      dPoint.X := X;
      dPoint.Y := Y;
      if CalcDist(FPoint, dPoint) < 4 then
        RoundCube1.RotationAngle.Y := RoundCube1.RotationAngle.Y + 45;
    end;
end;

仕様: 
MouseDown された位置と MouseUp された位置の二点間の距離が 4px 以下かつ、
マウスの左ボタンの処理だったらクリック扱いとする。
(マウスで押しっぱなしのまま 4px 以上移動してボタンを離すとクリックにはならない)

# VCL の挙動とは異なりますが、
# この後にダブルクリック判定を組み込むのが楽になります。


patlice2011  2012-09-17 18:37:34  No: 42931

できました。
ご指導ありがとうございました。
(MouseのUpとDownの両方確認しました)
できたので意味はありませんが、
私の使用環境は、
WIN7 SP1 64bit
Delphi XE2 Update4 Hotfix1
です。
2012/09/19 のエンバカのWEBセミナー(HTML5の)を見てから
Delphi XE3 だけ買うか RAD Studio XE3 を買うか
判断しようと思います。(RADは超高価ですからね)
Delphiの質問なら他のQ&Aサイトよりやっぱりこのサイトですね。


DEKO  2012-09-17 19:08:50  No: 42932

> できたので意味はありませんが、
エスパーしたのがたまたま当たっただけで、
環境は真っ先に書くべきものだと思いますよ。

> Delphiの質問なら他のQ&Aサイトよりやっぱりこのサイトですね。
公式フォーラムで質問して頂いていたらそちらで回答していたと思います (^^;A

[Embarcadero 公式フォーラム]
https://forums.embarcadero.com/category.jspa?categoryID=3


Mr.XRAY  2012-09-17 19:23:24  No: 42933

こんにちは.

>できたので意味はありませんが、
>私の使用環境は、
>WIN7 SP1 64bit
>Delphi XE2 Update4 Hotfix1
>です。

そんなことはないですよ.DEKO さんのところに以下のような記事があります.
http://ht-deko.minim.ne.jp/tech045.html#tech095

これは,主に質問者側から見た記事ですが,私のように,スキルのない者にとっても,
貴重な情報源です.
「なるほど,この環境,この Delphi のバージョンではそうなのか」
という情報が得られるんです.
ですから,後からでもいいので,環境を,それこそ「教えて頂きたい」というのも本音です.
この掲示板は,数少ない Delphi の情報源になっています.少なくとも私にとっては.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加