Roblox 中如何让 Cylinder 沿 Raycast 轨迹正确对齐?
将圆柱体的长度设为 Size.X,再在原有的居中变换后绕局部 Y 轴旋转 90°,就能让 Cylinder 沿 Raycast 轨迹延伸。
linea.Shape = Enum.PartType.Cylinder
linea.Size = Vector3.new(largo, .1, .1)
linea.CFrame = CFrame.lookAt(iniciovisible, impacto)
* CFrame.new(0, 0, -largo / 2)
* CFrame.Angles(0, math.rad(90), 0)
为什么 Block 正常,Cylinder 却朝向侧面?
原代码使用 Vector3.new(.1, .1, largo),将 Part 沿局部 Z 轴拉长。CFrame.lookAt(iniciovisible, impacto) 又使局部负 Z 方向指向终点,因此长方体能沿射线延伸。
Cylinder 的中心轴沿局部 X 轴,长度由 Size.X 控制。如果仍将长度放在 Size.Z,增大的就是圆柱体的横截面尺寸,而非轴向长度。Roblox PartType 文档
因此,尺寸和旋转都需要调整:
- 用
Vector3.new(largo, diameter, diameter)设置长度和直径。 - 在
lookAt生成的坐标系中追加绕 Y 轴旋转 90°,让圆柱体的局部 X 轴与射线方向对齐。 - 保留沿原局部负 Z 方向移动半个长度的操作,使圆柱体中心位于两点之间。
CFrame 的乘法顺序会影响结果。上述表达式将平移项写在附加旋转项之前。Roblox CFrame 文档
完整修改示例
示例沿用现有的事件和变量名,动画只增加直径、保持长度不变,以免圆柱体逐渐超出射线两端。
trazo.OnServerEvent:Connect(function(usuario, iniciovisible, impacto)
local largo = (impacto - iniciovisible).Magnitude
-- 两点重合时没有可显示的线段,也没有确定的朝向。
if largo <= 0 then
return
end
local linea = Instance.new("Part")
linea.Shape = Enum.PartType.Cylinder
linea.Anchored = true
linea.CanCollide = false
linea.Size = Vector3.new(largo, .1, .1)
linea.Transparency = .2
linea.CFrame = CFrame.lookAt(iniciovisible, impacto)
* CFrame.new(0, 0, -largo / 2)
* CFrame.Angles(0, math.rad(90), 0)
linea.Parent = workspace.Residuos
for count = 0, 3 do
linea.Size += Vector3.new(0, .1, .1)
linea.Transparency = math.min(1, linea.Transparency + .2)
task.wait(.1)
end
linea:Destroy()
end)
示例假设 trazo 已绑定到对应的 RemoteEvent,workspace.Residuos 已存在,且两个位置参数都是有效的 Vector3。
为什么原来的尝试无效?
把长度改到 Y 轴仍然没有对齐
linea.Size = Vector3.new(.1, largo, .1)
Cylinder 的中心轴是局部 X 轴,因此这段代码仍未设置它的轴向长度。即使改成 Vector3.new(largo, .1, .1),也需要补上旋转,否则圆柱体的中心轴仍与 lookAt 指向终点的方向垂直。
修改 lookAt 的目标坐标会改变射线方向
CFrame.lookAt 的前两个参数分别是起点位置和目标位置。这里直接使用 iniciovisible 和 impacto 即可,不需要拆分或替换坐标分量。
原尝试中的 Vector3.new(inicioinvisible, inicioinvisible, impacto) 存在参数问题:Vector3.new 需要三个数值分量,而 impacto 在现有代码中作为位置向量使用。此外,该表达式缺少闭合括号,inicioinvisible 也没有在给出的片段中定义。
三个尺寸分量一起增加会改变线段长度
原动画每次执行:
linea.Size += Vector3.new(.1, .1, .1)
对于 Cylinder,这会同时增加长度和横截面尺寸。如果要在淡出过程中保持两端位置不变,只增加 Y、Z 分量即可:
linea.Size += Vector3.new(0, .1, .1)
以上轴向设置适用于 Part.Shape = Enum.PartType.Cylinder。如果使用 MeshPart 或其他自定义模型,需要根据模型自身的轴向调整旋转。
备注:内容仅供参考。
