您的位置:首页 > 其它

Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.

2015-01-01 23:32 363 查看
  在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点显示虽然不在一起,但是是一个Mesh.Ogre本身的检测只能检测到这里,在我们这不满足要求,相应的点,线,面检测都需要自己来计算.

  在讲解本文之前,先看下射线的相关生成代码,只有先明白射线如何生成,生成最后是相对什么空间.

public override void MouseMove(MouseEventArgs e)
{
int offsetX = e.X - prePoint.X;
int offsetY = e.Y - prePoint.Y;
if (offsetX == 0 && offsetY == 0)
return;
if (Control.MouseButtons == MouseButtons.Left)
{
if (EngineCore.Instance.Select)
{
var node = EngineCore.Instance.ViewNode;
if (EngineCore.Instance.ActionType == ActionType.Translate)
{
var ray = this.CreateViewportRay(e.X, e.Y);

var pos = ray.Origin + ray.Direction * this.viewZ;
node.DerivedPosition = pos;
}
else if (EngineCore.Instance.ActionType == ActionType.Rotate)
{
node.Yaw((Real)(new Degree((Real)(offsetX * 0.15f))));
node.Pitch((Real)(new Degree((Real)(offsetY * 0.15f))));

}
else if (EngineCore.Instance.ActionType == ActionType.Scale)
{

}
}
else
{
Real dist = (this.camera.Position - EngineCore.Instance.ViewNode.DerivedPosition).Length;

this.camera.Position = EngineCore.Instance.ViewNode.DerivedPosition;
this.camera.Yaw((Real)(new Degree((Real)(-offsetX * 0.25f))));
this.camera.Pitch((Real)(new Degree((Real)(-offsetY * 0.25f))));
this.camera.MoveRelative(new Vector3(0, 0, dist));

EngineCore.Instance.AxisNode.Yaw((Real)(new Degree((Real)(-offsetX * 0.25f))));
EngineCore.Instance.AxisNode.Pitch((Real)(new Degree((Real)(-offsetY * 0.25f))));

}
}
this.renderWindow.Update();
prePoint = e.Location;

base.MouseMove(e);
}


鼠标移动事件
  结合前面讲解Ray的生成过程,我们知道,ray.Origin是鼠标点击的近截面上的点,而Direction是方向,因为已经归一化,也就是说这个是单位向量,那么我们只需要知道移动的目标与近截面的距离,就能得到我们点击z值了.

  效果就是鼠标左键按下是确定与近截面的距离,然后移动的时候,在视截体里,x,y是变化的,z固定的.测试了一下,效果不错,很满意,如我视点移到Y轴上,与x,z面垂直,就能保证移动物体在x,z面,根据不同的视角移动,现实感还是很强,也没有感觉不合理的位置.



  旋转就比较简单了,直接把鼠标的二维坐标映射过去就成,效果也还行.代码也在上面,不单独说了,缩放感觉放鼠标滚轮处理比较好,暂时不管了,就个很容易.最后是没选择物体是,摄像机会围绕模型旋转,具体实现大家看下代码就明白了.

  新的一年第一天,确定今年主要自学内容,C++ 11与Ogre,在这个项目完成后,主要重新啃C++,最好能用Ogre实现一些功能.

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: