如果我旋转model1,我能检测到model1和wall1的碰撞吗?我几乎找不到这方面的信息。提前谢谢。
墙壁和舞台包厢碰撞<h: BoxVisual3D宽度=";4〃;高度=";110〃;长度=";120〃;中心=";15,-50,50〃;填充=";灰色"/><ModelVisual3D。转换><旋转Transform3D。旋转><旋转Transform3D。旋转><旋转Transform3D。旋转><旋转Transform3D。旋转><旋转Transform3D。旋转><旋转Transform3D。旋转><ModelVisual3D。转换>
<!-- "Semi-submersible" -->
<h:BoxVisual3D Width="120" Height="4" Length="80" Center="10,0,12" Fill="Gray"/>
<h:BoxVisual3D Width="6" Height="30" Length="6" Center="0,0,24" Fill="Yellow"/>
Helix工具包没有冲突检测,但下面的代码介绍了如何使用Visual3DHelper.FindBounds
和Rect3D.Intersect
来接近某个对象,这可能会解决您的问题。
问题是,正如所评论的那样,旋转多维数据集可能无法完美工作,因为BoundingBox与轴对齐,因此如果多维数据集与轴不对齐,则BoundingBox将比多维数据集本身大,在某些情况下会在相交处生成假阳性。
如果墙与轴对齐,并且不担心立方体与墙的角碰撞(就像无限平面一样(,即使旋转立方体,这也会很好。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Margin="5">
<Slider x:Name="SliderX" Margin="5,10" Minimum="-30" Maximum="30" ValueChanged="Slider1_ValueChanged"/>
<Slider x:Name="SliderY" Margin="5,10" Minimum="-30" Maximum="30" ValueChanged="Slider1_ValueChanged"/>
</StackPanel>
<hx:HelixViewport3D x:Name="MyViewport" Grid.Column="1">
<hx:DefaultLights/>
<hx:BoxVisual3D x:Name="Wall" Height="30" Width="30" Length="1" Fill="Gray" Center="10,0,0"/>
<hx:BoxVisual3D x:Name="Object" Height="10" Width="3" Length="10" Fill="Yellow" Center="-10,0,0">
<hx:BoxVisual3D.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetX="{Binding ElementName=SliderX, Path=Value}" OffsetY="{Binding ElementName=SliderY, Path=Value}"/>
<RotateTransform3D CenterX="-10" CenterY="0" CenterZ="0">
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,0,1" Angle="45"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>
</hx:BoxVisual3D.Transform>
</hx:BoxVisual3D>
</hx:HelixViewport3D>
</Grid>
private void Slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
var rect1 = Visual3DHelper.FindBounds(Wall, Transform3D.Identity);
var rect2 = Visual3DHelper.FindBounds(Object, Transform3D.Identity);
var intersect = Rect3D.Intersect(rect1, rect2);
if (intersect != Rect3D.Empty)
Object.Fill = Brushes.Red;
else
Object.Fill = Brushes.Blue;
}
螺旋工具包中没有网格之间的碰撞检测。
样式化:碰撞边界几何体,而不是对象本身
任意物体的碰撞检测非常复杂,因为它取决于方向和形状。它还取决于你周围的风景:你的基准平面和建筑物、山丘或其他三维物体的形状。
球体很容易:可以通过在动画过程中插值中点的距离来检查碰撞球体。在继续制作动画之前,计算动量和新的运动矢量。
碰撞两个斑点对象需要测试数百万个三角形。要防止这种情况,请找到一个与对象一起移动的边界球体或边界矩形。若要测试碰撞,请测试边界对象,而不是blob本身。
不要重新发明轮子
我的建议是:看看SharpDX的DXVectorMath部分。它包含了查找边界对象的代码和许多由Christer Ericson编写的碰撞工具。如果不使用SharpDX,请考虑将DXVectorMath与SharpDX隔离到一个单独的DLL中,将Vector3类型转换为Vector3D,然后探索这些工具。不要重新发明轮子,数学很复杂,尤其是对于箱形物体。
https://github.com/sharpdx/SharpDX/blob/master/Source/SharpDX.Mathematics/Collision.cs
- 这个类的组织方式是,最不复杂的对象放在第一位,所以在大多数情况下,最不简单的对象将拥有最多的方法。请注意,并非所有形状此时都存在,也并非所有形状都有相应的结构。在命名和参数顺序中,只有具有相应结构的对象才应排在第一位。的顺序复杂性如下:
* 1. Point * 2. Ray * 3. Segment * 4. Plane * 5. Triangle * 6. Polygon * 7. Box * 8. Sphere * 9. Ellipsoid * 10. Cylinder * 11. Cone * 12. Capsule * 13. Torus * 14. Polyhedron * 15. Frustum