4

ランドスケープでのみ機能するこのアプリがあります。

シーンキットにオブジェクトがあります。そのオブジェクトは、次のように指定された特定の位置にあります。

 SCNNode * buttonRef = [scene.rootNode childNodeWithName:@"buttonRef" recursively:YES];
 SCNVector3 buttonRefPosition = [buttonRef position];

SCNVector3これをmainView2D 座標に変換する必要があります。

 mainView = (SCNView *)self.view;

シーンは直交カメラを使用しているため、パースペクティブはありません。カメラはデフォルトのカメラです。回転なし、並進なし。カメラの orthographicScale は 5.4 です。

どうすればそれを変換できますか?

CGPoint から SCNVector3 に変換するという逆の質問について、SO で他の回答を見つけましたが、SCNVector3 から CGPoint に逆にする方法は明らかではありません。

SCNView が UIView のサブクラスである場合、(0,0) は左上のポイントであり、iPhone 6 の横向きの場合、(667, 375) は右下のポイントです。

私のこのボタンは、高さのほぼ右端と中央にあります。UIKit に関して言えば、このボタンは (600, 187) にあると言えますが、これを行うと:

SCNNode * buttonRef = [scene.rootNode childNodeWithName:@"buttonRef" recursively:YES];
SCNVector3 buttonRefPosition = [buttonRef position];

SCNVector3 projectedPoint = [mainView projectPoint: buttonRefPosition];

projectPoint が (7.8, 375, 0) に等しい (?)

UIKitを使用して座標(7.8、375)に10x10のビューを追加すると、左下にビューが表示されます!!

私が言ったように、アプリはランドスケープでのみ動作しますが、これらの座標系はすべて混乱しています.

4

2 に答える 2

4

モデル空間ポイントをスクリーン空間ポイントに変換することは、投影と呼ばれます (カメラの投影変換を適用して 3D 空間から 2D 空間にマッピングするため)。レンダラー (GPU 経由) は、シーン内のポイントを画面に表示するために、フレームごとに何度も実行します。

自分で行う必要がある場合の便利な方法もあります。projectPoint:

于 2016-05-30T04:47:24.583 に答える