トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   とにかくFLASH【FLASHに関して全般】
     二次元的重なりについて(深度調整)
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
DAB2004
Åê¹ÆNo.44564
投稿日時: 2010-3-12 15:47
新米
居住地: 東京
投稿: 7
使用環境:
MacOSX10.5.8+FlashCS4
二次元的重なりについて(深度調整)
違うコミュニティに投稿してみたものの、何も反応がなく…、試しにこちらでも聞いてみようと思った次第です。

http://imagepot.net/view/126814626958.png

上記PNGを見てください。

上面ではなく、このように斜めから見下ろしたグリッド画像があるとします。この二次元的なグリッド25マスに対していくつかのブロック画像(当然こちらも二次元的に描かれたものです)をマスの座標に重ね合わせ、まるで三次元的に並べられているように見せたいのです。

ただ「手で静的に並べれば当然考えながら置きますので、不自然にならないように出来る」のでしょうが、今回はスクリプトで「動的にパーツを置きたい」と考えています。すると深度をどのようにしたら良いかという問題に当たった次第です。

置きたいブロック全部が一マス分のブロックであれば、並べた際にナンバリングの数字通りの深度(重なり順番)であれば、何も問題なく自然に重なって見えるのですが縦や横に二つ以上のマスを持ったブロックである場合に、どのような考え方をしたら「どっちが手前にあるかどうか」判定できるものでしょうか。。。

PNG左あたり、二つ以上のマスを持ったブロック同士でまず片方(基点?・先頭?)のブロックだけで見た場合、上記のように数字通りの重ね順ですと重ね合わせが逆になってしまいます。この場合、二マス分ブロックなら二つのマス目番号両方ともを使って判定させるとどうにかなるものでしょうか、それとももっと単純に判定できる方法があったりするのでしょうか?

※へんなブロック(コの字とか)が入ると深度コントロールだけでは明らかに無理だと思いますので、そういうブロックは無しとします。直線や2×2など上面から見た形が必ず矩形のものだけを考え、横に3つとか4×4とか大きいものが入っても大丈夫なように組みたい・また多くのブロックで全部のマスを埋める場合にも、それぞれのブロックの深度を判定し矛盾が出ない考え方が理想です

ヒントだけでも構いません、宜しくお願い致します!

※ちなみにFlash8・AS2.0書き出しで、別途ライブラリを使用する場合は組み込みもOK
ひろゆき
Åê¹ÆNo.44565
投稿日時: 2010-3-12 15:52
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 二次元的重なりについて(深度調整)
引用:
DAB2004さんは書きました:
違うコミュニティに投稿してみたものの、何も反応がなく…、試しにこちらでも聞いてみようと思った次第です。

そちらの質問は、きちんと閉じられたのでしょうか?

投稿に関しての注意点
引用:
複数の会議室、または複数のコミュニティサイトに、同じ質問を投稿することは、マルチポストと呼ばれるマナー違反行為ですのでおやめ下さい。


手前(21から25)が深度が上に、右(5, 10, 15, 20, 25)が深度が上になるようにすればいいのでは?
そのためには、連番(1から25)の管理ではなく、x座標、y座標の管理が必要になるように思います。
また、箱を重ねることも考慮するのであれば、z座標でも管理する必要があるでしょう。


----------------
質問する際は、回答者に具体的な情報を与えてください。

DAB2004
Åê¹ÆNo.44573
投稿日時: 2010-3-12 18:10
新米
居住地: 東京
投稿: 7
使用環境:
MacOSX10.5.8+FlashCS4
Re: 二次元的重なりについて(深度調整)
※もう一方のコミュニティスレは閉じておきました。

上に積み重ねる事は考えておりませんので、Z軸は必要ないですか。


「手前(21から25)が深度が上に、右(5, 10, 15, 20, 25)が深度が上になるようにすればいいのでは?」

そうなんです、単純な言葉で表せばそのような感じだと思います。ただ今回の場合は、最終的にはスクリプトで組もうとしているため具体的な考え方まで到着しないといけないのです…。

例えば13,18,23と三マスを使った縦ブロックがあり、14,15の二マスを使った横ブロックがある場合、二次元的に絵を重ねようとするなら「14,15二マスを使った横ブロック」が手前にこないといけませんよね? そこから13の使い方を逆とし、18,23の縦ブロックと13,14,15の横ブロックの場合は「18,13二マスを使った縦ブロック」が手前にくると思います。

つまり、右方向と縦方向(左下方向)のどちらを優先するとかしないとか、数ブロック使う場合の概念が存在しないため、そこを考えない限りは仮にこの二つのブロックの判定処理すら出来ないと思いました。

その他ヒントなどお持ちの方、いらっしゃいましたらお願いします。。
ひろゆき
Åê¹ÆNo.44589
投稿日時: 2010-3-14 16:15
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 二次元的重なりについて(深度調整)
コマ位置を連番のIDで管理するから、訳がわからなくなるので、
xy軸で管理しましょうと申し上げているのですが。

まずは、そこから考えるべきでは?


----------------
質問する際は、回答者に具体的な情報を与えてください。

DAB2004
Åê¹ÆNo.44595
投稿日時: 2010-3-15 10:44
新米
居住地: 東京
投稿: 7
使用環境:
MacOSX10.5.8+FlashCS4
Re: 二次元的重なりについて(深度調整)
はい、IDは当然振ってありますが、attachするためにも当然X座標やY座標でも管理できるようになっています。

※寧ろ私は最初座標で判定しようと考えましたが、それよりも簡略化・固定化されたIDの方が判定しやすいのではないか、と変えた次第でした(絶対的に、そこにしかブロックが置かれないため)

ただX座標(前の回答で言う右方向)とY座標(前の回答で言う左下方向)で管理したからといって、前述の優先・複数マスブロック問題が解決しやすいものでもないと思うのですが…いかがでしょう??

ちなみにですが、ひろゆきさんはXY管理なら私の問題を解決できる術をお持ちなのでしょうか?
ひろゆき
Åê¹ÆNo.44596
投稿日時: 2010-3-15 11:21
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 二次元的重なりについて(深度調整)
コマの座標を以下のように設定する。
(0,0) (1,0) (2,0) (3,0) (4,0)
(0,1) (1,1) (2,1) (3,1) (4,1)
(0,2) (1,2) (2,2) (3,2) (4,2)
(0,3) (1,3) (2,3) (3,3) (4,3)
(0,4) (1,4) (2,4) (3,4) (4,4)


[ルール]
y座標が大きいものほど、手前にある。
x座標が大きいものほど、右側(手前)にある。

y座標を優先して、判定する。


例えば、次のような場合
点13の座標は(2,2), 点18の座標は(2,3), 点23の座標は(2,4)
点14の座標は(3,2), 点15の座標は(4,2)

上記ルールを適用すれば、次のようになります。

最も手前にあるのは、y座標の最も大きい点23(2,4)
次に手前にあるのは、y座標が次に大きい点18(2,3)

残りの点13,14,15については、y座標は同じ2なので、
x座標で判定する。
この3つで最も手前にあるのは、x座標の大きい点15(4,2)
次に手前にあるのは、x座標が次に大きい点14(3,2)
最も奥にあるのは、x座標の最も小さい点13(2,2)

つまり、奥から 点13→点14→点15→点18→点23 となります。


次に、y座標とx座標が、手前にあるのか奥にあるのか、
その奥行きを表現するパラメータになりうるのですから、
例えば、x+y を depth(奥行き) として定義します。
すると、depthの値が大きい方が手前、小さい方が奥にあるということになります。

これを上記の例にあてはめれば、
点13のdepthは4, 点18のdepthは5, 点23のdepthは6
点14のdepthは5, 点15のdepthは6

[ルール]
同じdepthの場合は、y座標で判定する。

上記新ルールに沿えば、
やはり、奥から 点13→点14→点15→点18→点23 となります。

コマにdepthをあてはめると次のようになります。
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

以上がブロック単位での前後関係判定。


さて、これをオブジェクトで単位で判定するということですが、
オブジェクトの前後関係で問題になるのは、
そのオブジェクトの最も手前にあるブロックと、最も奥にあるブロックの2つです。

例えば、
オブジェクトA(点13,点18,点23)
オブジェクトB(点14,点15)
の場合

点13のdepth4, 点23のdepth6
点14のdepthは5, 点15のdepthは6

この場合は、オブジェクトBはオブジェクトAより手前にある。

次の場合は、どうでしょう?
オブジェクトA(点18,点23)
オブジェクトB(点13,点14,点15)

点18のdepth5, 点23のdepth6
点13のdepth4, 点15のdepthは6

この場合は、オブジェクトAはオブジェクトBより手前にある。


問題は、次の場合
オブジェクトA(点13,点18,点23)
オブジェクトB(点14)

点13のdepth4, 点23のdepth6
点14のdepthは5, 点14のdepthは5

オブジェクトA(点18)
オブジェクトB(点13,点14,点15)

点18のdepth5, 点18のdepth5
点13のdepth4, 点15のdepthは6

depthだけでは判定できません。

…ということを1つ1つ検証していく必要があるように思います。

これらのことを紙に書き出して、
いくつかのケースを検証していくと、オブジェクトの前後関係は、
オブジェクト同士が接している場合、その接しているブロックのdepthを比較することで
オブジェクトの前後関係が決まるということが分かります。
(接していない場合は、とりあえず脇に置いて)



このあたりのロジックを考えるのが面倒だということであれば、
「ZedBox」などのライブラリを使うのも手でしょう。


----------------
質問する際は、回答者に具体的な情報を与えてください。

DAB2004
Åê¹ÆNo.44599
投稿日時: 2010-3-15 16:17
新米
居住地: 東京
投稿: 7
使用環境:
MacOSX10.5.8+FlashCS4
Re: 二次元的重なりについて(深度調整)
個人レッスン的な事になっていますが、丁寧な解説ありがとうございました。

率直に申しますと、私も斜め軸は同じ深度として計算できるのではないかという理論までは考えてみた事があります。(「コマにdepthをあてはめると次のようになります」の図) そこまでの考えは間違っていなかった、という事を教えて頂けたように思います。

そこから私が派生して考えたいた事としては…
・深度は使わず、IDだけでどうにか出来ないだろうか
・ひろゆきさんと同じく先頭と(複数個の場合は)最後尾のID/深度で比較
・ブロックが複数個で出来ている場合、全てのブロックのID/深度を使って比較
・3Dの被写界深度的な考えで、目に見える頂点の接線を利用して算出(一番いけるかなと思ったもの)

…と、考えてはみても、縦では上手くいくけど横で矛盾が出たりなどケースをある程度作ってみても、統一性というか「なにが鍵であり、その鍵をどう使えば希望の比較となるか」が(感覚では)ギリギリの部分で見つけられずにいます。。(いくつかの数式から一つの方程式を作る作業に似ていると思っています…が、ごく簡単な何かを見落としている可能性もないとは言えません)


>…ということを1つ1つ検証していく必要があるように思います。

やはり私の最初の投稿にありますように『この場合、二マス分ブロックなら二つのマス目番号両方ともを使って判定させるとどうにかなるものでしょうか、それとももっと単純に判定できる方法があったりするのでしょうか?』このロジック?アルゴリズム?を見出す作業から先に進めていません。

ただ、もしかすると「この次のステップ」は既にヒントではなく解答なのかも知れませんが…。。


>オブジェクト同士が接している場合、その接しているブロックのdepthを比較することでオブジェクトの前後関係が決まるということが分かります。(接していない場合は、とりあえず脇に置いて)

自分で組めていないのですからこれは本当に勘ですが、接しているいないに関わらず、全てのブロックを判定出来るロジックが正解には存在するのではないかと感じています。


そういえば、ZedBoxはAS2.0用はあったりするのでしょうか?(検索したところ3.0用に見えましたが…)
961832p
Åê¹ÆNo.44607
投稿日時: 2010-3-16 20:19
常連
居住地: Akiruno-shi
投稿: 155
使用環境:
 
:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES(ASDT, MTASC, Eclipse, swfmill)
- Natural Entry Point Method
- LB.Log, Zeroi

Pro, Firefox, Chromium(Iron), IE

----------------
Pro,
Re: 二次元的重なりについて(深度調整)
 
話の方向が違っていたらスミマセン(汗)。

1個?複数個のマスで構成されたブロックを、一つのムービークリップとして深度で管理する場合、正しい奥ゆきで表示するのは難しそうですね。
あくまで一例なのですが、最小単位である1マスで構成されたブロックを、一つのムービークリップとして管理し、ブロックの構成情報(種類や何マスでできているか等)は別に持つというのはどうでしょうか?

たとえば、全体のマス数である25個分の要素をもつ配列を用意して、そこにどのムービークリップなのか識別する情報(下の例では数値)を入れておきます。

例:

//十の位がブロックのグループ(00は何も無いという意味)
var map_block:Array = [
    00,10,00,00,00,
    20,11,00,00,00,
    21,00,30,40,41,
    00,00,31,00,00,
    00,00,32,00,00
];

そして0から24までfor文などでまわしてあげて、個々のムービークリップへ若い深度から順に割り当てていきます。
上の例では10、20、11、21、30、40、41、31、32の順に、この値と紐づくムービークリップへ深度が割り当てられるといった感じです。
これなら、どんな形状でも大丈夫そうな気がします。

ブロックが動いたりする場合は配列でやると面倒そうなので、また別の工夫が必要になるかもしれません。


----------------
:961832p:
- だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー

DAB2004
Åê¹ÆNo.44608
投稿日時: 2010-3-16 22:31
新米
居住地: 東京
投稿: 7
使用環境:
MacOSX10.5.8+FlashCS4
Re: 二次元的重なりについて(深度調整)
>話の方向が違っていたらスミマセン(汗)

いえいえ、参加頂けているだけで嬉しく思います!


>1個?複数個のマスで構成されたブロックを、一つのムービークリップとして
>深度で管理する場合、正しい奥ゆきで表示するのは難しそうですね

やはりそうですよね…。う?ん難しい。。
感覚ではコの字型など明らかに一つの深度では表現できない形でなければ
いけるのではないか…と勝手な希望を持っていたのですが…(^ ^;


>最小単位である1マスで構成されたブロックを、一つのムービークリップ
>として管理し、ブロックの構成情報(種類や何マスでできているか等)は
>別に持つというのはどうでしょうか?

…ん。今…

今ビビッときました。二次元的な絵であるから、一つのMCとして扱わないと
いけないと決めつけて考えていました。
(その方が当然移動や管理含め、扱い易いに決まっていますが)

一枚の絵をブロックの(上空)範囲ごとにぶったぎったMCにして、あたかも
つながっているように見せたらいけそうですかね。
(本当なら三つ連続しているはずの絵でも分割して三つのMCにしてしまう)

一つのMCとして実現出来れば一番理想ではありましたが、力技っぽくても
とりあえずの問題が解決できそうな雰囲気がしてきました!

※このブロックの画像種類が膨大にある事(ぶったぎるだけでも相当な労力が)と、
このブロックはドラッグや回転(当然別画像ですが・笑)もできるように
考えていたため、一つのMCでない場合そこから先がかな?りメンドクサイ事に
なりそうですが…それは先のお話(苦笑)

http://imagepot.net/view/126874846713.png

上記のようなイメージでテストしてみようと思います!
(まだ頭の中だけですので、落とし穴ある…かも??)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops