簡體   English   中英

C#/WPF/Math 相對於相機定位 3D 模型

[英]C#/WPF/Math Orienting a 3D model relative to the camera

我正在使用 WPF Viewport3d。 視點來自一架不斷改變位置和方向的飛機(稱為 AC1)。 在這個視口中,我需要繪制另一架同樣改變位置和方向的飛機(稱為 Model2)。 我得到以下內容作為輸入:

  1. AC1 的 Lat/Lon/Alt, Heading/Pitch/Roll
  2. Model2 的 Lat/Lon/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));

然后我可以使用該 X/Y/Z 制作 TranslateTransform3D 並將模型移動到該位置。

我遇到的主要問題是模型的定位。 我嘗試將 Lat/Lon/Alts 轉換為 ECEF 空間,然后計算該空間中的方向,但這會弄亂位置和方向。 我還嘗試旋轉視點的軸,然后圍繞這些新軸旋轉 Model2,但這也不起作用。

有沒有人有一個簡單的算法來適當地定位 Model2? 理想情況下,我們不會旋轉相機,而是計算 Model2 相對於視點的方向。 如果我不想移動相機看起來很奇怪,那是因為 WPF Viewport3d 充當了 OpenGL 窗口頂部的疊加層,所以實際上我只需要 Model2 相對於 WPF 視口進行定位和定向,然后不要根本不需要移動視點(但如果更容易的話,我可以)。

希望這是有道理的。 如果沒有,我會嘗試詳細說明。 感謝您的任何幫助,您可以提供。

所以我最終讓它工作,只是不像我想要的那樣......在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>

對於 Model2 我做了這個輪換

<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>

然后在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;

我不知道如何在不旋轉相機的情況下做到這一點,但是通過旋轉相機和模型,然后通過旋轉矩陣 CameraTransformGroup.Value 和向量乘法運行計算的點,您可以計算相對於方向的新偏移量相機正對,從而正確定位和定向 Model2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM