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

如何正确弯曲网格模型?端点未随曲率适配的解决咨询

网格弯曲算法优化问题

我需要对网格进行弯曲操作,已有一套可行算法,但部分环节遇到瓶颈,以下是我的代码:

var mesh_data = mesh.surface_get_arrays(0) 
var vertices = mesh_data[Mesh.ARRAY_VERTEX] 

for i in range(vertices.size()):
    var v = vertices[i]
    var offset_x = pow(v.z, 2)
    v.x += offset_x  
    vertices[i] = v

mesh_data[Mesh.ARRAY_VERTEX] = vertices
result_mesh.mesh.clear_surfaces()
result_mesh.mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, mesh_data)

当前处理后,模型端点仍保持原始方向,未随网格其余部分的曲率变化。需要解决两个问题:

  • 如何让端点适配网格曲率?
  • 如何指定特定角度与精准的「旋转中心」?

解决方案

一、让端点适配曲率:同步更新顶点法向量

你当前仅修改了顶点位置,但未同步更新顶点法向量(若有UV坐标也需同步调整),这会导致渲染时端点的光照方向仍保持原始状态,视觉上呈现出方向未随曲率变化的效果。

修改步骤:

  1. 获取原始法向量数组:
var normals = mesh_data[Mesh.ARRAY_NORMAL]
  1. 对每个顶点的法向量执行与顶点位置匹配的变换,保持朝向一致:
for i in range(normals.size()):
    var n = normals[i]
    # 复用顶点计算时的z值偏移逻辑,系数可根据曲率调整
    var offset_x = pow(vertices[i].z, 2) * 0.1
    n.x += offset_x
    n = n.normalized()  # 维持法向量单位长度
    normals[i] = n
  1. 将更新后的法向量存回网格数据:
mesh_data[Mesh.ARRAY_NORMAL] = normals

二、指定旋转中心与特定角度:改用圆弧弯曲算法

当前使用的二次函数偏移(pow(v.z,2))无法精准控制角度和旋转中心,改用圆弧弯曲算法可实现精准参数控制:

示例代码(以Y轴为弯曲轴,可按需调整):

var mesh_data = mesh.surface_get_arrays(0) 
var vertices = mesh_data[Mesh.ARRAY_VERTEX] 
var normals = mesh_data[Mesh.ARRAY_NORMAL]

# 可配置参数
var bend_angle = PI/4  # 弯曲角度(90度对应PI/2)
var rotation_center = Vector3(0, 0, 0)  # 旋转中心坐标
var bend_axis = Vector3(0, 1, 0)  # 弯曲轴
var max_length = 2.0  # 网格沿弯曲轴方向的总长度

# 计算圆弧半径
var radius = max_length / bend_angle

for i in range(vertices.size()):
    var v = vertices[i]
    # 转换到旋转中心为原点的局部坐标系
    var local_v = v - rotation_center
    # 计算顶点沿弯曲轴的相对距离
    var t = local_v.dot(bend_axis)
    # 计算圆弧上的新位置
    var angle = bend_angle * (t / max_length)
    local_v.x = radius * sin(angle)
    local_v.z = radius * (1 - cos(angle))
    # 转换回原坐标系
    vertices[i] = local_v + rotation_center

    # 同步更新法向量
    var n = normals[i]
    var local_n = n - rotation_center
    local_n = local_n.rotated(bend_axis, angle)
    normals[i] = local_n.normalized()

mesh_data[Mesh.ARRAY_VERTEX] = vertices
mesh_data[Mesh.ARRAY_NORMAL] = normals
result_mesh.mesh.clear_surfaces()
result_mesh.mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, mesh_data)

关键说明

  • 圆弧弯曲算法通过参数bend_angle和rotation_center可精准控制弯曲效果,比二次偏移更可控。
  • 必须同步更新法向量,否则模型光照、阴影会出现异常,端点视觉上无法适配曲率。
  • 若模型沿其他轴延伸,只需调整bend_axis和坐标分量的计算逻辑即可。

内容的提问来源于stack exchange,提问作者RoB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:55:12