Viewport3D中的摄像机

上传人:汽*** 文档编号:470084028 上传时间:2023-09-22 格式:DOCX 页数:5 大小:199.96KB
返回 下载 相关 举报
Viewport3D中的摄像机_第1页
第1页 / 共5页
Viewport3D中的摄像机_第2页
第2页 / 共5页
Viewport3D中的摄像机_第3页
第3页 / 共5页
Viewport3D中的摄像机_第4页
第4页 / 共5页
Viewport3D中的摄像机_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《Viewport3D中的摄像机》由会员分享,可在线阅读,更多相关《Viewport3D中的摄像机(5页珍藏版)》请在金锄头文库上搜索。

1、在WPF中进行碰撞检测前文我简要的介绍了在WPF中,如何控制摄像头移动,已达到动画的效果。也带来了一个新的问题: 摄像头移动的时候,毫无阻拦,这就是所谓的“穿墙模式”。有没有什么办法解决这个问题呢?有,就 是在移动摄像头前先进行“碰撞检测”,确定摄像头的新位置区间中没有其他的三维模型。本文将介绍 如何在WPF中进行三维碰撞检测。利用 Rect3D.IntersectsWith 方法在进入下一节前,先看看最简单的碰撞检测方式:利用Rect3D.IntersectsWith方法。Model3D有一个Bounds属性,用来表示该Model3D的边界:该属性是Rect3D类型的,我们可以使用Inter

2、sectsWith来确定相机位置所在的矩形是否与此Rect3D 相交。如果是,则说明相机移动到Rect3D内部,冲突发生;如果否,则表示相机离Model3D还有一 段距离,可以放心地移动。发生碰撞的情况使用Rect3D.IntersectsWith方法,对于规规矩矩的正方体来说,效果很好。但是如果使用Rect3D.IntersectsWith方法检测摄像机是否和不规则物品的外接多边形发生碰撞,精确性会降低很多。 就拿上图来说,红色方块所在的摄像机实际上和房子还有很远一段距离,但却在房子所在区域里,这 个时候,Rect3D.IntersectsWith检测的结果是碰撞发生了。因此,需要用稍微复杂

3、一点的方法,VisualTreeHelper.HitTest方法,对三维物品进行命中测试,以处 理不规则物品的碰撞检测问题。利用 VisualTreeHelper.HitTest 方法VisualTreeHelper.HitTest是由三个函数重载而成的,在三维世界里,使用:public static void HitTest(Visual3D reference,HitTestFilterCallback filterCallback,HitTestResultCallback resultCallback,HitTestParameters3D hitTestParameters)方法来进

4、行命中测试。referenee:要进行命中测试的Visual3D。也就是场景中的不规则的三维物品。filtercallback:表示命中测试筛选回调值的方法,有时候,并非所有的三维物品都是不可穿越的,例 如泳池中的水,在没有结冰的前提下是阻止不了 Camera移动的,因此,可以filtercallback设置这些 物体。resultcallback:表示命中测试结果回调值的方法。hitTestParameters:要进行命中测试的三维参数值。对于最后一个参数,hitTestParameters,使用的是HitTestParameters3D的一个子类: RayHitTestParameters

5、 (也是目前HitTestParameters3D的唯一子类)。该类表示一个射线。看到这里,你大体会意思到如何使用VisualTreeHelper.HitTest来进行碰撞检测了吧。没错!我们将 Camera所在的位置看做射线的端点,Camera移动的方向看做射线的方向。通过VisualTreeHelper.HitTest方法,能得到当该射线的端点和Visual3D对象交点的距离:当这个距离满足一定的值时,就能得出:碰撞已发生。protected bool isCollision = false;public bool TestCollision(ProjectionCamera camera

6、)isCollision=false;foreach(Visual3D 3d in Word.Children)RayHitTestParameters rayparams =new RayHitTestParameters(camera.Position, camera.LookDirection);VisualTreeHelper.HitTest(element, null, HTResult, rayparams);if(isCollision) return true;return false;public HitTestResultBehavior HTResult(System.W

7、indows.Media.HitTestResult rawresult)RayHitTestResult rayResult = rawresult as RayHitTestResult;if (rayResult != null)RayMeshGeometry3DHitTestResult rayMeshResult =rayResult as RayMeshGeometry3DHitTestResult;/ 如果距离小于 1.0 ,则认为碰撞已发生if (rayMeshResult.DistanceToRayOrigin 1.0)isCollision = true;return HitTestResultBehavior.Stop;return HitTestResultBehavior.Continue;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号