Shade online フォーラム
ログイン
ユーザ名:

パスワード:

IDとパスワードを記憶

パスワード紛失
スレッド表示 | 古いものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | 下へ
投稿者 スレッド
ray
投稿数: 45
投稿日時: 2004-07-27 12:39
Re: 一発で
virtual void screen_to_world ( int view , const point_class& cp , vec3& p , void* aux =0 )

SDKにあるこの関数はスクリーン座標系の一点(XY座標)をワールド座標系の一点(XYZ座標)として出力するものなので行列を渡すことは出来ませんが、何か理解が違うでしょうか?

とりあえず現状ではアクティブな図面領域の左上、右上、左下の三点をサンプルとしてscreen_to_worldに処理させ、返ってきた座標を連立方程式解いて行列を逆算させています。


// scene_interface *sceneという前提

// 図面の表示状態を取得(1:上面図 2:正面図 3:側面図 4:四面図)
int active_view = scene->get_figure_view();
// 四面図表示だったら上面図をアクティブにする
if( active_view == 4 ) active_view = 1;
// アクティブな図面の領域情報を取得
rectangle_class viewArea = scene->get_view_rectangle();
// スクリーン上のサンプル点を設定
point_class pLt(viewArea.left, viewArea.top),
            pRt(viewArea.right, viewArea.top),
            pLd(viewArea.left, viewArea.down);
// ワールド座標系に変換
vec3 vLt, vRt, vLd;
scene->screen_to_world(active_view, pLt, vLt);
scene->screen_to_world(active_view, pRt, vRt);
scene->screen_to_world(active_view, pLd, vLd);
// 足りない一次元を三次元カーソルから補完
vec3 cur_pos = scene->get_corsor_position();
switch (active_view) {
  case 1:
    vLt.y = vRt.y = vLd.y = cur_pos.y;
    break;
  case 2:
    vLt.z = vRt.z = vLd.z = cur_pos.z;
    break;
  case 3:
    vLt.x = vRt.x = vLd.x = cur_pos.x;
    break;
}
// 行列を逆算
mat4 s2w_mat;
// ここから連立方程式を解いて行列を逆算する処理
// s2w_mat = 
// | m11 m12 m13 t1 |
// | m21 m22 m23 t2 |
// | m31 m32 m33 t3 |
// |  0   0   0   1 | とすると
// vLt.x = m11 * pLt.x + m12 * pLt.y + t1
// vLt.y = m21 * pLt.x + m22 * pLt.y + t2
// vLt.z = m31 * pLt.x + m32 * pLt.y + t3
// 残りの二点についても同様
// あとは連立方程式を解いてm11,m12,m21,m22,m31,m32,t1,t2,t3を導くだけ
// m13,m23,m33は不定となるが、適当に0でも詰めておく

あまり綺麗なソースではないかもしれませんが、こんな感じでやってます。
投稿数: 189
投稿日時: 2004-07-26 20:48
一発で
引用:

rayさんは書きました:
しかし、screen_to_world()の中でどんな行列をかけてるのか分かれば一発で出来るんですが、そういうのはないんですかねぇ

screen_to world に 4×4 の単位行列を渡して、変換されて戻ってきた matrix がその「 どんな行列 」になると思いますが、それじゃダメですか ?
ray
投稿数: 45
投稿日時: 2004-07-26 15:28
挑戦中
加藤さん、ありがとうございます。

とりあえず今は
scene_interface::get_pixel_size()
にて1ピクセルがShade空間中でどれだけのサイズか調べ、
scene_interface::get_view_rectangle()
で、対象となる図面の領域を調べ、
scene_interface::screen_to_world()
で基点となる(たとえば領域の左上の)スクリーン上での座標がShade空間中ではどんな座標になるのか、などを調べています。

最終的には4x4の行列にまとめてやって使うつもりです。

しかし、screen_to_world()の中でどんな行列をかけてるのか分かれば一発で出来るんですが、そういうのはないんですかねぇ(^^; screen_to_worldで何点かサンプル点を処理させて、そこから行列を逆算、とかのほうがスマートなのかな・・・少しは
投稿数: 189
投稿日時: 2004-07-25 10:44
三面図
こんにちわ、

ray さんのやりたいことは、三面図の1ピクセルの大きさが解ればいいのではないでしょうか。

script では pixcel size というので get できますから、SDK のなかで同じような名前で捜してみてはどうでしょう。


ちなみに、座標変換の関数はいくつか用意されているようですが、参考までに
( といってもこれは人から教えてもらった情報のまんまですが )

local_to_world :
ローカル座標からワールド(グローバル)座標へ

user_to_world :
現在表示されている座標からワールド座標へ
current unit への変換、ローカル座標モードや、ろくろへの変換も含む

world_to_perspective :
ワールド座標から正規化された( 縦横:-1〜1、奥行き:0〜1 )透視座標系へ

world_to_view :
view 座標:視点が原点で、視線のを Z 軸とした座標系( カメラの傾きも考慮される )

world_to_device :
device 座標:正規化された透視座標系から、縦横を実際のピクセル座標に一致するように変換した座標系
ray
投稿数: 45
投稿日時: 2004-07-25 03:19
追記
用語の意味するところが違っていたことに気がついたので補足です。
デバイス座標というのが実はレンダリング画像上での座標を表すということが(今更)分かったのですが、今行いたい処理は全く別物ですね。

正式になんと名前がついているのか分かりませんが、図面上での2次元座標(モニターでのXY座標)から三次元座標(一次元足りなくなりますが、それは三次元カーソルから取得するというShade本体と同じ仕様にするつもりです)へ変換する方法が分からないということで、質問の追記としておきます。

SDKドキュメントの中で座標系の話がちょろちょろと出てきますが、言葉の定義がしっかり書いてないと読みづらいですね・・・。
ray
投稿数: 45
投稿日時: 2004-07-25 00:48
デバイスからワールド座標系へ
今作っているプラグインの中で

・現在アクティブな図面を調べる(一面表示のときだけでなく、四面図表示でも)
・その上に点列をばら撒き、それがワールド座標系ではどういう座標を持つか調べる

という処理が必要になっています。

アクティブな図面を調べるのはなんとか出来そうなのですが、デバイス座標系(x,y)からワールド座標系(x,y,z)への変換はどう処理して良いのか分からなくて困ってしまいました。


scene_interface::get_device_to_world_matrix()


というそのものズバリな名前の関数も、実はデバイス座標系から透視図へ(厳密にはちょっと違いますが)の変換だと分かり、じゃあ、三面図はどうしたらいいんだろう、と(ローカル座標とかろくろとか考えたら結構大変そうです)

もし何か心当たりのある方などおられましたら教えていただけるとうれしいです。

SDKのバージョンはShade6 rev20です(Win版はShade7でも動きますね)
スレッド表示 | 古いものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | トップ

最近の投稿

フォーラム スレッド 返信 閲覧 最終投稿
Free Talk DNAの2重らせんの水素結合部位の作成 0 11789 2016-08-01 21:37 Benthos
Free Talk パート内の名前を一括返還 2 14306 2016-03-07 12:21 画像投稿機
Dev Forum イームズシェルチェアーの作成 2 14199 2015-11-25 14:44 CR7
Free Talk MOVファイルについて 17 35342 2014-12-29 17:14 momokuma
Dev Forum 2種類の液体アニメーションを作る方法 0 14283 2014-11-13 10:42 mejapan
Free Talk 面取りについて 0 13405 2014-11-08 15:18 MoonChild
Free Talk 丸太を結ぶ縄の作成について 1 19614 2014-09-18 22:33 kenslab
Free Talk パーティクルフィジックスのメタパーティクルについて 0 13869 2014-09-03 20:40 penta
Free Talk データの保存に関して 2 13720 2014-08-18 01:24 sierra
Free Talk Shade 3D ver14での、ポリゴンメッシュへの変換以上終了 1 14136 2014-04-23 12:04 MASA_