C# 网格在摄影机旋转/移动时开始跳跃
大家好 第一次在这里发帖,因为我被卡住了 网格离原点(0,0,0)越远,旋转或移动相机时“跳跃”/“闪烁”的次数越多。很难描述这种效果:就像网格有点抖动/颤抖/颤抖,随着距离原点越来越远,这种抖动越来越大。C# 网格在摄影机旋转/移动时开始跳跃,c#,directx,direct3d,mesh,slimdx,C#,Directx,Direct3d,Mesh,Slimdx,大家好 第一次在这里发帖,因为我被卡住了 网格离原点(0,0,0)越远,旋转或移动相机时“跳跃”/“闪烁”的次数越多。很难描述这种效果:就像网格有点抖动/颤抖/颤抖,随着距离原点越来越远,这种抖动越来越大。 对我来说,它开始在距离原点大约100000个单位的距离处被观察到,例如在(0,0,100000)处。平移轴和网格类型(从mesh.Create…或使用assimp.NET导入的3ds mesh创建的默认网格)都不会影响此效果。发生此效果时,网格位置的值不会更改,请通过记录位置来进行检查 如果
对我来说,它开始在距离原点大约100000个单位的距离处被观察到,例如在(0,0,100000)处。平移轴和网格类型(从mesh.Create…或使用assimp.NET导入的3ds mesh创建的默认网格)都不会影响此效果。发生此效果时,网格位置的值不会更改,请通过记录位置来进行检查 如果我没有遗漏什么,这将把范围缩小到两种可能性:
private void InitializeDevice()
{
//初始化D3D
_d3dObj=新的D3D9.Direct3D();
//设置演示参数
_presParams=新的D3D9.PresentParameters();
_预参数加窗=真;
_预参数s.SwapEffect=D3D9.SwapEffect.Discard;
_presParams.AutoDepthStencilFormat=D3D9.Format.D16;
_presParams.EnableAutoDepthStencil=true;
_presParams.PresentationInterval=D3D9.PresentInterval.One;
_presParams.BackBufferFormat=_d3dObj.Adapters.DefaultAdapter.CurrentDisplayMode.Format;
_presParams.BackBufferHeight=_d3dObj.Adapters.DefaultAdapter.CurrentDisplayMode.Height;
_presParams.BackBufferWidth=_d3dObj.Adapters.DefaultAdapter.CurrentDisplayMode.Width;
//将窗体宽度和高度设置为当前backbuffer宽度和高度
this.Width=\u presParams.BackBufferWidth;
this.Height=\u presParams.BackBufferHeight;
//检查设备功能
D3D9.caps=_d3dObj.GetDeviceCaps(0,D3D9.DeviceType.Hardware);
D3D9.CreateFlags devFlags=D3D9.CreateFlags.SoftwareVertexProcessing;
D3D9.DeviceType devType=D3D9.DeviceType.Reference;
//根据设备功能设置设备标志
如果((caps.VertexShaderVersion>=新版本(2,0))&&(caps.PixelShaderVersion>=新版本(2,0)))
{
//如果设备支持vertexshader和pixelshader>=2.0
//然后使用硬件设备
devType=D3D9.DeviceType.Hardware;
if(caps.DeviceCaps.HasFlag(D3D9.DeviceCaps.HWTransformAndLight))
{
devFlags=D3D9.CreateFlags.HardwareVertexProcessing;
}
if(caps.DeviceCaps.HasFlag(D3D9.DeviceCaps.PureDevice))
{
devFlags |=D3D9.CreateFlags.PureDevice;
}
}
//初始化设备
_device=新的D3D9.device(_d3dObj,0,devType,this.Handle,devFlags,_preparams);
//集剔除
_device.SetRenderState(D3D9.RenderState.CullMode,D3D9.Cull.逆时针);
//设置texturewrapping(无缝球体贴图需要)
_device.SetRenderState(D3D9.RenderState.Wrap0、D3D9.TextureWrapping.All);
//设置照明
_device.SetRenderState(D3D9.RenderState.Lighting,false);
//启用z缓冲区
_device.SetRenderState(D3D9.RenderState.ZEnable,D3D9.ZBufferType.UseZBuffer);
//并将写访问权限精确设置为true。。。
//我对此有点偏执,因为我不得不与奇怪的重叠网格斗争几天
_device.SetRenderState(D3D9.RenderState.ZWriteEnable,true);
}
我是否缺少旗帜或渲染状态?是否有什么东西会导致这种奇怪/扭曲的行为
我的相机等级基于:
//每个带下划线前缀的变量都是
//预先初始化的私有静态变量
公共静态类摄像机
{
//每帧调用一次
公共静态无效更新()
{
如果(_过滤器)
{
_filteredPos=Vector3.Lerp(_filteredPos,_pos,_filterAlpha);
_filteredRot=四元数.Slerp(_filteredRot,_rot,_filterAlpha);
}
_device.SetTransform(D3D9.TransformState.Projection,Matrix.PerspectiveFovLH(_fov,_screenAspect,_nearClippingPlane,_FarcClippingPlane));
_SetTransform(D3D9.TransformState.View,GetViewMatrix());
}
公共静态无效移动(矢量3增量)
{
_pos+=delta;
}
公共静态空隙旋转偏航(浮动θ)
{
_rot=四元数。乘法(四元数。旋转轴(_up,-θ),_rot);
}
公共静态空隙旋转节距(浮动θ)
{
_rot=四元数乘法(_rot,四元数旋转轴(_right,theta));
}
公共静态无效设置目标(矢量3目标,矢量3向上)
{
设置位置和目标(_pos,target,up);
}
公共静态无效设置位置和目标(矢量3位置、矢量3目标、矢量3 upVec)
{
_pos=位置;
向量3向上,右,注视=目标位置;
lookAt=Vector3.规范化(lookAt);
右=矢量3.交叉(upVec,注视);
右=矢量3.规格化(右);
向上=矢量3.交叉(向右看);
向上=矢量3.标准化(向上);
设置轴(注视,向上,向右);
}
公共静态无效设置轴(Vector3注视,Vector3向上,Vector3向右)
{
矩阵rot=矩阵。恒等式;
rot.M11=右.X;
rot.M12=向上.X;
rot.M13=lookAt.X;
rot.M21=右.Y;
rot.M22=up.Y;
rot.M23=lookAt.Y;
rot.M31=右.Z;
rot.M32=向上.Z;
rot.M33=lookAt.Z;
_rot=四元数旋转矩阵(rot);
}
公共静态空心视图场景(边界球体)
{
设置位置和目标(sphere.Center