You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Castle Game Engine射线投射向量绘制无显示问题求助

Castle Game Engine射线投射向量可视化问题排查

我在基于Pascal的Castle Game Engine中尝试绘制网格来可视化射线投射向量。参考官方示例后,我自定义了带参数的CreateMesh过程,传入角色的AvatarTransform来获取位置设置顶点,但代码编译正常却始终无法显示射线向量。

自定义的问题代码

procedure CreateMesh(const AvatarTransform: TCastleTransform);
begin
  Mesh := TCastleRenderUnlitMesh.Create(true);
  Mesh.SetVertexes([
    Vector4(0.0, AvatarTransform.Translation.Y, 0.0, 1.0),
    Vector4(0.0, (AvatarTransform.Translation.Y - AvatarTransform.Direction.Y), 0.0, 1.0),
  ], false);
  Mesh.SetIndexes([
    // line loop on Z = -1
    0, 1
  ]);
end;

// 后续调用时我曾怀疑参数不匹配,但调整后还是无法绘制
CreateMesh;

参考的正常示例代码

此前参考的可正常绘制网格的示例代码如下:

procedure CreateMesh;
begin
  Mesh := TCastleRenderUnlitMesh.Create(true);
  Mesh.SetVertexes([
    Vector4(-1, -1, -1, 1),
    Vector4( 1, -1, -1, 1),
    Vector4( 1,  1, -1, 1),
    Vector4(-1,  1, -1, 1),

    Vector4(-1, -1,  1, 1),
    Vector4( 1, -1,  1, 1),
    Vector4( 1,  1,  1, 1),
    Vector4(-1,  1,  1, 1)
  ], false);
  Mesh.SetIndexes([
    // line loop on Z = -1
    0, 1,
    1, 2,
    2, 3,
    3, 0,

    // line loop on Z = 1
    4, 5,
    5, 6,
    6, 7,
    7, 4,

    // connect Z = -1 with Z = 1
    0, 4,
    1, 5,
    2, 6,
    3, 7
  ]);
end;

// 示例中后续调用
CreateMesh;

排查关键点

  • 参数传递错误:自定义的CreateMesh要求传入AvatarTransform参数,但调用时写的CreateMesh;未传参,这会导致顶点数据错误(若编译器允许无参调用,可能使用了未初始化的变量)。正确调用应为CreateMesh(YourAvatarTransform);,传入角色的实际Transform对象。
  • 顶点坐标逻辑错误:当前顶点仅设置了Y轴坐标,X和Z均为0,线段可能处于视角盲区或被角色模型完全遮挡。正确的射线起点应为角色完整位置,终点是角色位置加上方向向量,示例修正:
    Mesh.SetVertexes([
      // 起点:角色当前位置
      Vector4(AvatarTransform.Translation.X, AvatarTransform.Translation.Y, AvatarTransform.Translation.Z, 1.0),
      // 终点:角色位置沿方向向量延伸(可乘倍数调整长度)
      Vector4(AvatarTransform.Translation.X + AvatarTransform.Direction.X * 5, 
              AvatarTransform.Translation.Y + AvatarTransform.Direction.Y * 5, 
              AvatarTransform.Translation.Z + AvatarTransform.Direction.Z * 5, 1.0)
    ], true);
    
  • 网格未加入场景:创建Mesh后,必须将其添加到场景节点树中,比如:
    Container.Add(Mesh); // 假设Container是场景根节点
    
    否则网格不会被引擎渲染。
  • 渲染模式设置:TCastleRenderUnlitMesh默认可能使用填充模式,需手动设置为线框模式才能显示线段:
    Mesh.RenderOptions.Mode := rmLines;
    
  • 顶点所有权设置:SetVertexes的第二个参数OwnsVertexes设为true,让引擎管理顶点内存,避免潜在的内存访问问题。

内容的提问来源于stack exchange,提问作者Joshua P Fingerle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:57:03