• ベストアンサー

正6面体を一定の角度で回転させたい

DPEの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

#2です。 「 //正6面体のポリゴンデータ・・・」から 「 WireFrame( 0 , 0 , 0 ); 」までのスクリプト(ポリゴンの頂点の定義から計算・描画用の関数と、サンプルとして真正面から見た立方体を表示する処理まで)を、メインのタイムラインのフレーム1に書いていませんでしょうか? このスクリプトは、新規に作った空のムービークリップが持っているタイムラインの、フレーム1に設定します。 最初に四角形が表示された時、この四角形はどこに表示されましたでしょうか。 ステージの左上の方に表示されたのなら、これらのスクリプトをメインのタイムラインに書いたことが原因と思われます。 タイムラインの上の方を見てください。 ここに「シーン 1 」としか表示されていないのであれば、編集中のタイムラインはメイン(ムービーそのもの)のタイムラインです。 シンボルを編集している時は、「シーン 1 」「(編集中のシンボルの名前)」と表示されます。 ムービークリップのシンボルの編集画面は特に、ムービーそのものの編集画面とレイアウトが全く同じで紛らわしいです。どのタイムラインを編集しているか分からなくなったら、この表示を見て確認してください。 スクリプトを設定したタイムラインが違っているようでしたら、「シンボル1」の編集画面を開いて、スクリプトを移動してみてください。 ActionScript では、参照したいインスタンスや変数・関数を持っている階層がどこなのかを、はっきりと指定して操作しなければなりません。この指定のことを、ターゲットパスといいます。 メインのタイムラインに座標の計算や描画関数の定義等を書いた場合、WireFrame 関数は _root という階層の持ち物になります。 メインのタイムラインで WireFrame 関数が定義されていたとすると、この関数は「シンボル1」のインスタンスのものではないので、  _root.WireFrame( ・・・ ); または  _parent.WireFrame( ・・・ ); このように、ターゲットパスを付けた書き方でないと呼び出せません。 最初の WireFrame( 0 , 0 , 0 ); は、関数の持ち主と同じタイムラインで呼び出しています。 ActionScript では、自分が持っている関数や変数・インスタンスを利用するなら、ターゲットパスを省略できる決まりになっています。 関数がメインのタイムラインで定義されていたとしても、WireFrame( 0 , 0 , 0 ); は同じタイムライン上で呼び出しているので最初の四角形は表示されます。 ところが、このスクリプトを消してムービークリップから呼び出すようにすると、ターゲットパスがないために関数が呼び出しに失敗して、何も表示されなくなるというわけです。 #2のスクリプトでは、ムービークリップシンボルのタイムラインで各関数を定義しています。 onClipEvent を設定したムービークリップ(のインスタンス)はこのシンボルの分身ですから、シンボルと同じ関数を内部に持っています。 WireFrame 関数は自分のものですので、ターゲットパスを付けなくても呼び出せます。 他のムービークリップから呼び出したい時は、立方体を描画するインスタンスまでのターゲットパスが必要です。 例えば、このインスタンスに” cube ”とインスタンス名を付けたとすると、  _root.cube.WireFrame( 0 , 0 , 0 ); このようなターゲットパスを付けて呼び出します。 ターゲットパスを自動で入力してくれる機能があります。 「アクション」パネルの上部に7つほどアイコンが並んでいますが、この中の中央のアイコンをクリックしてください。リストから対象を選ぶだけで、そこまでのターゲットパスが自動で入力されます。 ターゲットパスがよく分からない時に利用してみてください。 3Dの計算と描画関数をムービークリップシンボルのタイムラインで定義すると、立方体はムービークリップ自身の座標系を中心に描画されます。 つまり、ステージではムービークリップを置いた地点を中心にして立方体が描画されますので、どこでも好きな位置に立方体を配置できます。 しかし、メインのタイムラインにスクリプトを書いた時は、ステージの中心点(左上)を基点に立方体が描画されてしまい、融通が利かなくなります。 ---------------------------------------------- スクリプトの書き方やレイアウトは人によって様々です。 私は { } で1行ずつ使って段落のようにする書き方が気に入っていますが、自動フォーマットでは、これがシンタックスエラーとして扱われることがあります。 しかし、この書き方は文法上は間違いではないので、シンタックスチェックをすると誤りはないと出てきます。 本当にシンタックスエラーがある時は、「ムービープレビュー」や「パブリッシュ」の際にエラーが報告されます。 何の報告もないのに上手く動かないようなら、エラーではなく、バグ(文法に間違いはないが、スクリプトの組み方に不具合がある)があるということです。 ---------------------------------------------- ところで、アニメのサンプルスクリプトですが。 5フレームに1度だと、動きがちょっとカクカクしてしまいますね。 onClipEvent(enterFrame) の中の  if( wait >= 5 ) を  if( wait >= 3 ) くらいにしてみてください。3フレームに1度、回転の計算が行われます。 それから回転する角度ですが、これはいろいろ変えてみて、面白い角度やお好みの角度を見つけていただきたいのですが、  //X軸回りに回転  WireFrame( angle , -20 , 50 ); こんな角度もちょっと面白かったので、よろしければお試しください。 (白状しますと、#2の角度は適当に作った試験用のデータでした ^^ゞ) 変数を2つ作って  //X・Y軸を同時に回転  WireFrame( angle_x , angle_y , 50 ); このように2つの軸回りに同時に動かしても、面白い回り方になります。 同様にして3軸回りに同時に回転させることもできますけれど、やりすぎると妙な動きになって3D酔いしてしまうので、ほどほどにしましょう。 ---------------------------------------------- 今回は立方体だったのですが、配列変数 poly に入れたポリゴンの頂点データを変えると、他の立体もワイヤフレームで描画できます。 ただし、Draw_Polygon 関数はポリゴンが四角形であるものとして作ってあります。例えばピラミッドや角錐のように、三角形のポリゴンが入る立体は正常に描画できません。 三角形を描画できるようにするには、  //四角形の左上の頂点から右回りに線を引く  for( j = 1 ; j <= 3 ; j++ ) この部分を  for( j = 1 ; j <= 2 ; j++ ) とします。頂点が減った分、線を引くループの回数を減らすということです。   ピラミッドは、底面が四角形、側面が三角形です。 四角形と三角形の描画関数を別々に作ると面倒ですから、底面を四角形のポリゴンではなく、対角線で分割した三角形2枚と考えます。これなら、三角形を描画する関数だけで済みます。 三角形は最も基本的な多角形で、全ての多角形はいくつかの三角形に分割できる点を利用した考え方です。 頂点が増えるため計算時間が増えるところが難点ですが、四角形と三角形が混在すると頂点データの持ち方も複雑になることから、全て三角形のポリゴンとして描画する3DCGソフトもあります。 複雑な立体を描画するなら、共有する頂点は計算しないといった、高速化を図る工夫も必要になってきます。 まあ、あまり複雑なものは Flash ではなく、3DCGソフトで作った方が早いですね。 余談ですが。 ファイルサイズが軽ければ処理も軽いとは限りません。 今回の作例はスクリプトだけなのでファイルサイズは小さいですが、三角関数や乗算といった複雑な計算を何回もやらせたり、巨大な配列を使ってメモリを消費していますので、処理はそれなりに重いです。 (更に複雑な3DCGもホイホイと描画できる今時のパソコンなら、大した負担ではありませんが・・・) また、外部から画像を多数読み込むようなムービーは、ムービー本体の容量は軽いですが、読み込まれた画像がメモリを占有してしまい、読み込む画像が多すぎると、システムが遅くなるなどの深刻な症状が発生するほどの重いムービーになりかねません。 もっとも、ファイルが大きければ、それだけ最初からメモリやシステムリソースを大量に占有するということですので、一般的には処理は重いです。 ワイヤフレームのアニメや、計算で描画するCGの考え方は昔からあります。 ただ、お粗末な演算能力のCPUと、何キロバイトという程度の少ないメモリしか積んでいなかったパソコンでは計算に時間がかかりすぎて、実用的ではなかっただけです。 今回はさしあたって、”立方体を回転して、ワイヤフレームで描画する”という、これ1つで完結したムービークリップをご紹介しました。 もう少し構造を整理すると、任意のポリゴンデータをワイヤフレームで表示するといった、汎用性の高いシンボルにもできますが、これはまたの機会にでも考えてみてください。 とりあえず、無事に表示して、いろいろ回転してみてください。 本来は2Dの絵しか扱えないできない Flash で3Dっぽい絵が表示できるというのは、ちょっと感動ですよ。 またまた長くなってすみませんでした。

van-moore
質問者

お礼

お返事が遅くなってしまい申し訳ありませんでした。 2度のアドバイスありがとうございます。 やはりメインのタイムラインにかいていた事が原因でした^^; 今度はちゃんと真ん中に表示されるようになったので安心しました。 回転角度の設定も簡単にできるという事で、自分なりにいろいろ研究してみたいと思います。

関連するQ&A

  • 角度と回転

    お世話になります 「角度 回転」等で検索すると、計算式やマウスに連動して図形等が回転するHPはたくさん見つかるのですが、 XYZの角度を数値入力して、モデルの回転を確認できるHPもしくはフリーのソフトがございましたら、紹介していただけないでしょうか。 よろしくお願いいたします。

  • 画像の回転(角度)

    こんにちは。 画像の角度の回転方法が分らず困っています。 今、マウスのカーソル周りを三つの画像が周る スクリプトを作ろうとしています。 それで、画像がマウスの周りを回る時に角度を 変えつつ回転させたいのです。 たとえば、↓ こういった矢印画像があったと すると、つねにカーソルの中心を指した状態で カーソルの周りを回るようにしたいです。 マウスの周りを回転するというのはサンプルで いくつか出てきたのですが、画像自体の回転の 方法は見つけられませんでした。 出来れば、両方のサンプルコードのあるサイト か、実際のコードを書いて頂けると助かります。 宜しくお願いします。

  • 回転を使って、ハンドル操作をしたい

    いつも、ありがとうございます。MACOSX、Flash8です。 ゲームの中で、ハンドル操作ができるようにしたいのですがなかなかうまくいかなくて困っています。 マウスの座標から、角度を出してrotationしたいのですが。 MouseDownで EnterFrame、マウスをドラッグしている間にカーソルに 合わせて回転してほしいのです。 1回転する必要はなく45度とー45度の間だけで動かします。 ハンドルのトップを0として、マウス座標から計算した角度をいれることによってできないかと思っているのですが、スクリプトがうまくかけません。 宜しく、お願い致します。

    • ベストアンサー
    • Flash
  • Flash初心者の私にできるでしょうか?

    IT BoostのHPのFlashみたいなものを作ろうと思っていますが、 ど素人の私には作り方が思い浮かびません。 http://school.itboost.co.jp/ 最初の数字が走って飛び散るのはActionscriptでやるのでしょうか? そのあとIT Boostの文字が光っていますが、あの光らせ方は難しいですか? 最後にメニューが出てきてマウスをあわせると一瞬光りますが、これは簡単でしょうか? はじめてのFlashMXという本ではとてもここまではできませんので、 アドバイスを頂けれたら幸いです。 宜しくお願いします。

  • FlashMX アクションについて

    動画をFlashMXで作成しているのですが、「ボタンにマウスポインタを置く上で動画が始まる」という設定の仕方がわかりません。「はじめてのActionScript」という本を買って来て見ても難しくてできません。 初心者でも解りやすいHPなど、教えてください。

  • フレーム(0)に行くと値が初期化される

    お世話になっております。 actionscript3.0 で作成しております。 レイヤーが2つあり、フレームが5個あります。 (1)のレイヤーにアニメーションがあり、 (2)のレイヤーにvar count=1; count=count+1; のスクリプトがあります。 このアニメーションをぐるぐる回したいのですが、 countの値が最初のフレームで毎回初期化されるため、 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,・・・ となります。 countの初期化を最初の一回だけ走らして、 1,2,3,4,5,6,7,8,9,10,11,・・・ としたいのですが、どのようにすればよいでしょうか? 何卒よろしくお願い致します。

    • ベストアンサー
    • Flash
  • ActionScript で写真を水平に回転させる方法

    複数の写真をランダムで水平に回転させたいのですが、 ActionScript でどの function を使えば良いかご存知ですか? ムービークリックでも試してみたのですが、 画像が時計周りに回転するのを防ぐ方法はありますでしょうか? 作りたいものは Apple の Core Animation のビデオで 残り1分40秒に出てくるようなイメージです。 http://www.news.com/1606-2_3-6103330.html

    • ベストアンサー
    • Flash
  • すべてのActionScriptを一斉に止める方法

    現在作成しているFlashに関してなんですが、いろいろなフレームで繰り返し処理を行うActionScriptを使用しています。 例えば、これらの処理を100フレームに到達した時点ですべて一斉に止めたいと思っているのですが、コマンドで「このフレームですべてのActionScriptの処理を中止する」のようなコマンドはあるのでしょうか? 途中からガラっと内容が変わるFlash(音楽のみ継続)を作成中で、最初の場面では多数のScriptが動いていて、ひとつひとつ止めるのは大変&ちゃんと止まってくれなかった物もあるので、問答無用で全てを止めてくれるコマンドがあったら助かるなぁ思ったので。 辞典などいろいろ見てみたのですが、見つからなかったので無いのかもしれませんが、何か助言等頂けたらと思います。 どうぞよろしくおねがい致します。 ≪使用環境≫ Windows2000 FlashMX2004

  • 回転した座標軸と一致させるための回転軸と角度の算出

    こんにちは。お知恵をお借りしたく質問致します。 プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。 ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。) 図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。 また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)です。回転方向は、ベクトルの向きに時計回り…右ネジの法則みたいな感じです。 x軸から見たXの角度(θxX), y軸からのX(θyX), z軸からのX(θzX) 同様にx軸から見たY(θxY),θyY,θzY、θxZ,θyZ,θzZ といったように、それらの角度(コサイン値)は分かっています。 (=xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっている。) z軸とZ軸の外積を取ったベクトルを回転軸として、θzZが分かっているのでその角度で回転することでZ軸は一致しますけど、XY軸は合いません。(当然ですが…) そのXY軸を合わせるためにまた回転するというのも遠回りで、任意の軸1本を中心に何度か回転するだけ(上記関数を1度使用するだけ)で、必ず向きが一致する解があると思うのですが、その任意軸と角度を算出する方法が分かりません。 一般にどういう計算をするのでしょうか。アドバイスいただければ幸いです。 なお、上記関数を用いない方法でも構いません。 「X軸(Y軸、Z軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • ムービークリップの位置と角度の制御について

    スクリプト初心者です。 ●矢印の形をした、ムービークリップ(mc1)がステージ端まで移動すると跳ね返り、跳ね返る方向に向きを変えるスクリプトで悩んでいます・・。 ●ステージサイズ:400×300  シーン1、1フレーム目にmc1配置。 mc1をシーン1に配置の際、角度45度に。 mc1に下記スクリプトを書きました。 onClipEvent(load){     vx=5;     vy=5; } onClipEvent(enterFrame){ this._x += vx; this._y += vy; if (400 < this._x) { vx = -5; this._rotation=-135; } if (300 < this._y) { vy = -5; this._rotation=135; } if (this._x < 0) { vx = 5; this._rotation=-45; } if (this._y < 0) { vy = 5; this._rotation=45; } } ●ステージ端まで行くと矢印(mc1)が跳ね返る事は、出来たのですが、方向(回転角度)がうまく出来ませんでした・・。 自分でも、これでは、回転角度がうまく行かないと分かってはいるのですが・・。 どなたかお分かりの方おられましたら助けてください! よろしくお願いいたします。

    • ベストアンサー
    • Flash