如何正确弯曲网格模型?端点未随曲率适配的解决咨询
网格弯曲算法优化问题
我需要对网格进行弯曲操作,已有一套可行算法,但部分环节遇到瓶颈,以下是我的代码:
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坐标也需同步调整),这会导致渲染时端点的光照方向仍保持原始状态,视觉上呈现出方向未随曲率变化的效果。
修改步骤:
- 获取原始法向量数组:
var normals = mesh_data[Mesh.ARRAY_NORMAL]
- 对每个顶点的法向量执行与顶点位置匹配的变换,保持朝向一致:
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
- 将更新后的法向量存回网格数据:
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
相关产品推荐
相关产品推荐

