Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 网格在摄影机旋转/移动时开始跳跃_C#_Directx_Direct3d_Mesh_Slimdx - Fatal编程技术网

C# 网格在摄影机旋转/移动时开始跳跃

C# 网格在摄影机旋转/移动时开始跳跃,c#,directx,direct3d,mesh,slimdx,C#,Directx,Direct3d,Mesh,Slimdx,大家好 第一次在这里发帖,因为我被卡住了 网格离原点(0,0,0)越远,旋转或移动相机时“跳跃”/“闪烁”的次数越多。很难描述这种效果:就像网格有点抖动/颤抖/颤抖,随着距离原点越来越远,这种抖动越来越大。 对我来说,它开始在距离原点大约100000个单位的距离处被观察到,例如在(0,0,100000)处。平移轴和网格类型(从mesh.Create…或使用assimp.NET导入的3ds mesh创建的默认网格)都不会影响此效果。发生此效果时,网格位置的值不会更改,请通过记录位置来进行检查 如果

大家好

第一次在这里发帖,因为我被卡住了

网格离原点(0,0,0)越远,旋转或移动相机时“跳跃”/“闪烁”的次数越多。很难描述这种效果:就像网格有点抖动/颤抖/颤抖,随着距离原点越来越远,这种抖动越来越大。
对我来说,它开始在距离原点大约100000个单位的距离处被观察到,例如在(0,0,100000)处。平移轴和网格类型(从mesh.Create…或使用assimp.NET导入的3ds mesh创建的默认网格)都不会影响此效果。发生此效果时,网格位置的值不会更改,请通过记录位置来进行检查

如果我没有遗漏什么,这将把范围缩小到两种可能性:

  • 我的相机代码
  • DirectX设备
  • 对于DirectX设备,这是我的设备初始化代码:

    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