Hololens开发笔记-MRTK模型切割例程算法解析

MRTK的package在MRTK\Examples\StandardShader 路径下提供了模型切割例程ClippingExamples。切割效果如下:(例程中原效果灰色部分是透明的)

在这里插入图片描述

实现切割主要分为两部分:切割算法以及不同模型之间的变量传递。

1、 切割算法

        切割例程中主要用到了Assets/MRTK/Core/Utilities/StandardShader路径下的CilpingPlaner.cs、ClippingBox.cs、ClippingSphere.cs、ClippingPrimitive.cs三个脚本文件以及Assets/MRTK/Core/StandardAssets/Shaders路径下的MixedRealityStandard.shader着色器。
        例程中实现了三种切割:平面切割(plane)、球切割(sphere)以及立方体切割(cube)。

//位置关系计算的实现位于D:\JCS\project\2_AR\HZtoCS\HoloLensMRTK\Assets\MRTK\Core\StandardAssets\Shaders\MixedRealityShaderUtils.cginc文件中
#if defined(_CLIPPING_PLANE)
inline float PointVsPlane(float3 worldPosition, float4 plane)
{
    float3 planePosition = plane.xyz * plane.w;//得到平面中心点的位置
    return dot(worldPosition - planePosition, plane.xyz);//plane.xyz是平面的法向量
}
#endif

#if defined(_CLIPPING_SPHERE)
inline float PointVsSphere(float3 worldPosition, float4 sphere)
{
    return distance(worldPosition, sphere.xyz) - sphere.w;//计算世界空间下点的位置距离球心的距离
}
#endif

#if defined(_CLIPPING_BOX)
inline float PointVsBox(float3 worldPosition, float3 boxSize, float4x4 boxInverseTransform)
{
    float3 distance = abs(mul(boxInverseTransform, float4(worldPosition, 1.0))) - boxSize;//abs返回向量每个成员的绝对值,正方形内的所有坐标都是小于等于boxsize的。
    return length(max(distance, 0.0)) + min(max(distance.x, max(distance.y, distance.z)), 0.0);//length返回向量的模
}
#endif

        面切割算法:对于心脏模型的每一个片元,在世界坐标系下,使用平面的法线向量n与平面中心点到待渲染点的方向向量d做点乘。根据计算结果的正负号将模型划分为平面的内侧和外侧两部分。
        球切割算法:对于心脏模型的每一个片元,计算其到球心的距离,如果小于半径,则位于内侧,反之,位于外侧。
        立方体切割算法:对于心脏模型的每一个片元,将片元坐标变换到立方体的模型坐标系下得到坐标position,用position的每个坐标分量取绝对值再减去立方形大小。最终得到的坐标中最大值大于零的,说明在立方体外,最大值小于零的说明在立方体内。

2、变量传递

        变量传递主要是通过场景中的Renderer实现的,以Plane为例说明,传递关系如下图所示:
在这里插入图片描述

传递过程设计的主要代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Skyline_98

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值