显示 3D 模型的坐标(位置)
Display 3D model's coordinates (position)
我在 C# wpf 中有一个 3D 模型,每次使用时间跨度旋转 360 度旋转 5 度。但我希望能够像在 window 表单上查看 point3DX、point3DY、point3DZ 一样查看其坐标。
我该怎么做?
这是我设置模型初始位置和旋转的函数
private void SetViewPosition()
{
Vector3D vAxis = new Vector3D(0, 0, 1);
///<summary>
///R = AxisAngleRotation()
///vAxis = Vector length
///-15 = Angle
///</summary>
AxisAngleRotation3D myRotation = new AxisAngleRotation3D(vAxis, -15);
RotateTransform3D myRotationTransform = new RotateTransform3D(myRotation);
gCamWC = myRotationTransform.Value;
gCamWC.M14 = -50;
gCamWC.M24 = 10;
gCamWC.M34 = 0;
Point3D camPosition = new Point3D(gCamWC.M14, gCamWC.M24, gCamWC.M34);
Vector3D startLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);//VLook = 1st Column//DT=[1,0,0]//Vertical
Vector3D startLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);//VUp = 2nd Column//DT = [0,0,1]//Vertical
DrawingControl.Viewport.SetView(camPosition, startLookAt, startLookUp, 0);//=DR -> How the camera should move
}
//STEP 4
private void RotatingModelAround(object sender, EventArgs e)
{
Vector3D vAxis = new Vector3D(gCamWC.M31, gCamWC.M32, gCamWC.M33); //Rotate about world z-axis.
AxisAngleRotation3D myRotation = new AxisAngleRotation3D(vAxis, 5);
RotateTransform3D myRotationTransform = new RotateTransform3D(myRotation);
Matrix3D doTranslation = new Matrix3D();
doTranslation.M24 = 3; // Offset along camera y-axis. Presumed to be parallel to world plane.
gCamWC.Append(myRotationTransform.Value);
gCamWC.Append(doTranslation);
Point3D camPosition = new Point3D(gCamWC.M14, gCamWC.M24, gCamWC.M34);
Vector3D camLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);
Vector3D camLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);
DrawingControl.Viewport.SetView(camPosition, camLookAt, camLookUp, 0);
}
这就是他们的名字
public XplorerMainWindow()
{
InitializeComponent();
Closed += XplorerMainWindow_Closed;
//STEP 1
Loaded += XplorerMainWindow_Loaded;
Closing += XplorerMainWindow_Closing;
DrawingControl.UserModeledDimensionChangedEvent += DrawingControl_MeasureChangedEvent;
InitFromSettings();
RefreshRecentFiles();
UserFilters = new FilterValues();//COBie Class filters, set to initial defaults
CoBieTemplate = UkTemplate;
if (Settings.Default.PluginStartupLoad)
RefreshPlugins();
//STEP 4
// Add Dispatcer Time so the Rotation will be repeated
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += RotatingModelAround;
//dispatcherTimer.Tick += QRotateModel;
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0,300);//(d,h,m,s,mil.s.)
dispatcherTimer.Start();
}
例如根据我的项目,我想要这部分代码:
Point3D camPosition = new Point3D(gCamWC.M14, gCamWC.M24, gCamWC.M34);
Vector3D camLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);
Vector3D camLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);
... 显示在我的 window 表单中,例如:
相机位置:(-50.00, 10.00, 0.00)
相机注视:(1.00, 0.00, 0.00)
相机查找:(0.00, 0.00, 1.00)
并且相机每旋转5度,改变的值就会显示在window表格上
(请参阅下面的更新,以回应您进一步澄清您的问题:))
最初你说你想知道你的 3d 模型的坐标。
I have a 3D model in C# wpf that rotates 360degrees rotating 5degrees
each time using timespan. But I want to be able to view its
coordinates like viewing the point3DX, point3DY, point3DZ on my window
form.
但是您在评论中澄清说您感兴趣的实际上是相机位置。
... what I want is to ... view the coordinates or position of the
camera each time it moves, I want the coordinates to be displayed on
my window form.
假设评论是您真正的问题(如何获取和显示相机的 3d 位置),这是我的解决方案:
gCamWC 是 Matrix3D。我知道这是因为:
gCamWC = myRotationTransform.Value;
..并且由于 myRotationTransform 是一个 RotateTransform3d,它的值是一个 Matrix3D (documentation)。
我不熟悉 Matrix3D,但是快速的 MSDN 搜索表明您可以创建一个标签(我将称之为 posLabel)并在添加 gCamWC 后在 RotatingModelAround 方法中执行此操作:
posLabel.Text = "{0}\t{1}\t{2}", gCamWC.offsetX, gCamWC.offsetY, gCamWC.offsetZ;
如果有效,这应该使标签显示如下内容(例如 3.0、6.7、8.9 的向量):
3.0 6.7 8.9
**(抱歉,SO 格式不允许我使用制表符空格,但每个值之间会有一个制表符)*
它应该在每次旋转时更新。
编辑:
你说你想要这样的标签:
Camera Position: (-50.00, 10.00, 0.00) Camera LookAt: (1.00, 0.00,
0.00) Camera LookUp: (0.00, 0.00, 1.00)
尝试创建一个名为 posLabel 的标签,然后在 RotatingModelAround() 方法中完成附加 gCamWC 后添加以下代码:
posLabel.Text = "Camera Position: (" + gCamWC.M14 + ", " + gCamWC.M24 + ", " + gCamWC.M34 + ") Camera LookAt: (" + gCamWC.M11 + ", " + gCamWC.M21 + ", " + gCamWC.M31 + ") Camera LookUp: (" + gCamWC.M13 + ", " + gCamWC.M23 + ", " + gCamWC.M33 + ")";
我在 C# wpf 中有一个 3D 模型,每次使用时间跨度旋转 360 度旋转 5 度。但我希望能够像在 window 表单上查看 point3DX、point3DY、point3DZ 一样查看其坐标。
我该怎么做?
这是我设置模型初始位置和旋转的函数
private void SetViewPosition()
{
Vector3D vAxis = new Vector3D(0, 0, 1);
///<summary>
///R = AxisAngleRotation()
///vAxis = Vector length
///-15 = Angle
///</summary>
AxisAngleRotation3D myRotation = new AxisAngleRotation3D(vAxis, -15);
RotateTransform3D myRotationTransform = new RotateTransform3D(myRotation);
gCamWC = myRotationTransform.Value;
gCamWC.M14 = -50;
gCamWC.M24 = 10;
gCamWC.M34 = 0;
Point3D camPosition = new Point3D(gCamWC.M14, gCamWC.M24, gCamWC.M34);
Vector3D startLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);//VLook = 1st Column//DT=[1,0,0]//Vertical
Vector3D startLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);//VUp = 2nd Column//DT = [0,0,1]//Vertical
DrawingControl.Viewport.SetView(camPosition, startLookAt, startLookUp, 0);//=DR -> How the camera should move
}
//STEP 4
private void RotatingModelAround(object sender, EventArgs e)
{
Vector3D vAxis = new Vector3D(gCamWC.M31, gCamWC.M32, gCamWC.M33); //Rotate about world z-axis.
AxisAngleRotation3D myRotation = new AxisAngleRotation3D(vAxis, 5);
RotateTransform3D myRotationTransform = new RotateTransform3D(myRotation);
Matrix3D doTranslation = new Matrix3D();
doTranslation.M24 = 3; // Offset along camera y-axis. Presumed to be parallel to world plane.
gCamWC.Append(myRotationTransform.Value);
gCamWC.Append(doTranslation);
Point3D camPosition = new Point3D(gCamWC.M14, gCamWC.M24, gCamWC.M34);
Vector3D camLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);
Vector3D camLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);
DrawingControl.Viewport.SetView(camPosition, camLookAt, camLookUp, 0);
}
这就是他们的名字
public XplorerMainWindow()
{
InitializeComponent();
Closed += XplorerMainWindow_Closed;
//STEP 1
Loaded += XplorerMainWindow_Loaded;
Closing += XplorerMainWindow_Closing;
DrawingControl.UserModeledDimensionChangedEvent += DrawingControl_MeasureChangedEvent;
InitFromSettings();
RefreshRecentFiles();
UserFilters = new FilterValues();//COBie Class filters, set to initial defaults
CoBieTemplate = UkTemplate;
if (Settings.Default.PluginStartupLoad)
RefreshPlugins();
//STEP 4
// Add Dispatcer Time so the Rotation will be repeated
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += RotatingModelAround;
//dispatcherTimer.Tick += QRotateModel;
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0,300);//(d,h,m,s,mil.s.)
dispatcherTimer.Start();
}
例如根据我的项目,我想要这部分代码:
Point3D camPosition = new Point3D(gCamWC.M14, gCamWC.M24, gCamWC.M34);
Vector3D camLookAt = new Vector3D(gCamWC.M11, gCamWC.M21, gCamWC.M31);
Vector3D camLookUp = new Vector3D(gCamWC.M13, gCamWC.M23, gCamWC.M33);
... 显示在我的 window 表单中,例如:
相机位置:(-50.00, 10.00, 0.00) 相机注视:(1.00, 0.00, 0.00) 相机查找:(0.00, 0.00, 1.00)
并且相机每旋转5度,改变的值就会显示在window表格上
(请参阅下面的更新,以回应您进一步澄清您的问题:))
最初你说你想知道你的 3d 模型的坐标。
I have a 3D model in C# wpf that rotates 360degrees rotating 5degrees each time using timespan. But I want to be able to view its coordinates like viewing the point3DX, point3DY, point3DZ on my window form.
但是您在评论中澄清说您感兴趣的实际上是相机位置。
... what I want is to ... view the coordinates or position of the camera each time it moves, I want the coordinates to be displayed on my window form.
假设评论是您真正的问题(如何获取和显示相机的 3d 位置),这是我的解决方案:
gCamWC 是 Matrix3D。我知道这是因为:
gCamWC = myRotationTransform.Value;
..并且由于 myRotationTransform 是一个 RotateTransform3d,它的值是一个 Matrix3D (documentation)。
我不熟悉 Matrix3D,但是快速的 MSDN 搜索表明您可以创建一个标签(我将称之为 posLabel)并在添加 gCamWC 后在 RotatingModelAround 方法中执行此操作:
posLabel.Text = "{0}\t{1}\t{2}", gCamWC.offsetX, gCamWC.offsetY, gCamWC.offsetZ;
如果有效,这应该使标签显示如下内容(例如 3.0、6.7、8.9 的向量):
3.0 6.7 8.9
**(抱歉,SO 格式不允许我使用制表符空格,但每个值之间会有一个制表符)*
它应该在每次旋转时更新。
编辑: 你说你想要这样的标签:
Camera Position: (-50.00, 10.00, 0.00) Camera LookAt: (1.00, 0.00, 0.00) Camera LookUp: (0.00, 0.00, 1.00)
尝试创建一个名为 posLabel 的标签,然后在 RotatingModelAround() 方法中完成附加 gCamWC 后添加以下代码:
posLabel.Text = "Camera Position: (" + gCamWC.M14 + ", " + gCamWC.M24 + ", " + gCamWC.M34 + ") Camera LookAt: (" + gCamWC.M11 + ", " + gCamWC.M21 + ", " + gCamWC.M31 + ") Camera LookUp: (" + gCamWC.M13 + ", " + gCamWC.M23 + ", " + gCamWC.M33 + ")";