2016-03-24 13 views
-1

私はWPF Viewport3dを使っています。その視点は、常に位置と方向を変えている航空機(AC1と呼ぶ)からのものです。このビューポートでは、位置と方向を変更する別の航空機(Model2と呼ぶ)を描く必要があります。に/ピッチ/ロールを見出し、C#/ WPF/Mathカメラとの相対的な3Dモデルの方向付け

  1. AC1の緯度/経度/ Altキー、見出し/ピッチ/ロール
  2. モデル2の緯度/経度/ Altキー、および方位角/エレベーション/レンジ相対:私は、入力として、以下与えていますAC1

私はパースペクティブカメラを回転/再配置しないと、Model2を配置するのは難しくありません。カメラは方向(0,0、-1)で上を(0,1,0)にします。そのセットアップで私は得ることができる

double X = range * Math.Cos(ConvertDegreesToRadians(elevation)) * Math.Sin(ConvertDegreesToRadians(mSATAzimDeg)); 
double Y = range * Math.Sin(ConvertDegreesToRadians(elevation)); 
double Z = range * Math.Cos(ConvertDegreesToRadians(elevation)) * Math.Cos(ConvertDegreesToRadians(azimuth)); 

私はTranslateTransform3Dを作成し、その位置にモデルを移動するためにそのX/Y/Zを使用することができます。

私が大きな問題にぶつかっているのは、モデルの向きを変えることです。私はLat/Lon/AltsをECEF空間に変換してから、その空間内の方位を計算しようとしましたが、位置と向きが乱れてしまいます。私は視点の軸を回転させてみましたが、新しい軸の周りにModel2を回転させましたが、それはどちらも動作しません。

誰かがModel2を適切に方向付けるための簡単なアルゴリズムを持っていますか?理想的には、カメラを回転させるのではなく、モデル2を視点に対してどのように向けるべきかを計算するのが理想的です。 WPF Viewport3dがOpenGLウィンドウの上にオーバーレイとして機能しているので、カメラを移動したくないと思われる場合は、実際にはModel2をWPFのViewportとドンに対して相対的に配置して配置する必要があります視点を動かす必要はありません(しかし、それが簡単なのであればできます)。

うまくいけばうまくいきます。もしそうでなければ、私は精緻化しようとするでしょう。あなたが提供できるお手伝いをありがとう。

答えて

0

は、だから私は、それが動作することXAMLで私はカメラ

<Transform3DGroup x:Name="CameraTransformGroup"> 
    <RotateTransform3D> 
    <RotateTransform3D.Rotation> 
     <AxisAngleRotation3D Axis="0,0,1" Angle="{Binding AC1Roll, ElementName=UserControl}" /> 
    </RotateTransform3D.Rotation> 
    </RotateTransform3D> 
    <RotateTransform3D> 
    <RotateTransform3D.Rotation> 
     <AxisAngleRotation3D Axis="1,0,0" Angle="{Binding AC1Pitch, ElementName=UserControl}" /> 
    </RotateTransform3D.Rotation> 
    </RotateTransform3D> 
    <RotateTransform3D> 
    <RotateTransform3D.Rotation> 
     <AxisAngleRotation3D Axis="0,-1,0" Angle="{Binding AC1Heading, ElementName=UserControl}" /> 
    </RotateTransform3D.Rotation> 
    </RotateTransform3D> 
</Transform3DGroup> 

ために、このローテーションを設定するには...私が望んでいたとモデル2のために、私は、この回転をしただけでなく、かなりの道を終わった

その後RelativeOffsetX/Y/Zの背後にあるコードでは、私が行う方法を動作しませんでした

double wXOffset = mRng * Math.Cos(mElevation * GeoConstants.DEG2RAD) * Math.Sin(mAzimuth * GeoConstants.DEG2RAD); 
double wYOffset = mRng * Math.Sin(mElevation * GeoConstants.DEG2RAD); 
double wZOffset = mRng * Math.Cos(mElevation * GeoConstants.DEG2RAD) * Math.Cos(mAzimuth * GeoConstants.DEG2RAD); 

Matrix3D wCameraRotation = CameraTransformGroup.Value; 

Vector3D wNewXyz = Vector3D.Multiply(new Vector3D(wXOffset, wYOffset, wZOffset, wCameraRotation); 
this.RelativeOffsetX = wNewXyz.X; 
this.RelativeOffsetY = wNewXyz.Y; 
this.RelativeOffsetZ = wNewXyz.Z; 

によって算出され

<Transform3DGroup> 
    <RotateTransform3D> 
    <RotateTransform3D.Rotation> 
     <AxisAngleRotation3D Axis="0,0,-1" Angle="{Binding Roll, ElementName=UserControl, Converter={StaticResource RadToDegConverter}}" /> 
    </RotateTransform3D.Rotation> 
    </RotateTransform3D> 
    <RotateTransform3D> 
    <RotateTransform3D.Rotation> 
     <AxisAngleRotation3D Axis="1,0,0" Angle="{Binding Pitch, ElementName=UserControl, Converter={StaticResource RadToDegConverter}}" /> 
    </RotateTransform3D.Rotation> 
    </RotateTransform3D> 
    <RotateTransform3D> 
    <RotateTransform3D.Rotation> 
     <AxisAngleRotation3D Axis="0,-1,0" Angle="{Binding Heading, ElementName=UserControl, Converter={StaticResource RadToDegConverter}}" /> 
    </RotateTransform3D.Rotation> 
    </RotateTransform3D> 
    <TranslateTransform3D OffsetZ="{Binding RelativeOffsetZ, ElementName=UserControl}" 
         OffsetX="{Binding RelativeOffsetX, ElementName=UserControl}" 
         OffsetY="{Binding RelativeOffsetY, ElementName=UserControl}" /> 
</Transform3DGroup> 

それはカメラを回転させることなく、カメラとモデルを回転させ、計算された点を回転行列CameraTransformGroup.Valueとベクトル乗算で実行することで、カメラが向いている方向に対する新しいオフセットを計算することができます。 Model2。

関連する問題