我该如何制作自己的球形投射函数?

我想这基本上是在几乎所有方向上的射线投射,就像这样创建一个射线:

Ray.new(Vector3.new(x,y,z)  -- origin
Vector3.new(x,y,z))         -- direction

澄清:我正在Roblox上创建一个可以不断旋转360度的迪斯科球。每次球每转一个度左右,就会向几乎所有方向发射射线。这些射线使用FindPartOnRay(ray)记录任何接触点的位置。然后,我将光放在从FindPartOnRay(ray)获取到的位置上。

点赞
用户2726734
用户2726734

我可能会开始按照下面的方式来实现它:

function spherecast(radius, centre, objects)
   local hits = {}

   for i, obj in pairs(objects) do
      local d = radius + obj.size
      local dx = obj.x - centre.x
      local dy = obj.y - centre.y
      local dz = obj.z - centre.z
      local sqrdist = dx * dx + dy * dy + dz * dz
      if sqrdist <= d * d then
         table.insert(hits, obj)
      end
   end
   return hits
end

我知道您可能想要更多关于碰撞的信息,但作为第一次尝试,这很快。 obj.size是最大的尺寸(宽度,高度,深度)。

2014-11-06 04:53:34
用户5388687
用户5388687

我的方法如下:

准备一个迪斯科球和一个光源的固定点,向球发送光线,这样就可以轻松获取球面上每个光线的当前角度。在光线撞击球体表面的每个点上,发射一条以相反角度为方向的光线(必须从撞击点的迪斯科球表面法线中获取)。当这些反射光线在房间内撞击到物体时,你就可以看到发光的斑点。

可以使用一个光栅来处理从虚拟光源到迪斯科球的所有直接光线。在这种情况下,只需要使用 Physics.Raycast。

为了模拟球体的旋转,可以让这些光线不断地缓慢移动到一侧。这样你就可以在房间里看到移动的斑点。迪斯科!

2015-09-29 12:06:12