如何在 OpenMesh 中给面着色?
How to color faces in OpenMesh?
OpenMesh 文档中没有为面部着色的示例。我应该使用哪个函数将 fh0 着色为绿色? (我尝试了mesh.set_color但是没有成功。你可以在代码的第二部分看到我的尝试)
import openmesh as om
import numpy as np
mesh = om.TriMesh()
# add a a couple of vertices to the mesh
vh0 = mesh.add_vertex([0, 1, 0])
vh1 = mesh.add_vertex([1, 0, 0])
vh2 = mesh.add_vertex([2, 1, 0])
vh3 = mesh.add_vertex([0,-1, 0])
vh4 = mesh.add_vertex([2,-1, 0])
# add a couple of faces to the mesh
fh0 = mesh.add_face(vh0, vh1, vh2)
fh1 = mesh.add_face(vh1, vh3, vh4)
fh2 = mesh.add_face(vh0, vh3, vh1)
# add another face to the mesh, this time using a list
vh_list = [vh2, vh1, vh4]
fh3 = mesh.add_face(vh_list)
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
for face in mesh.faces():
mesh.set_color(face, [0.67578125, 0.296875, 0.3515625])
om.write_mesh('test.obj', mesh)
但这给了我
IndexError: index 3 is out of bounds for axis 0 with size 3
如何在 OpenMesh 中为面添加颜色?
面颜色是 OpenMesh 中的标准属性之一。
To add a standard property to an entity simply use the appropriate request method.
在你的情况下它将是 mesh.request_face_colors()
。
有几个问题:
mesh.request_face_colors()
是 TriMesh
对象支持存储面部颜色所必需的。
mesh.set_color
需要一个 alpha 通道,所以你的颜色实际上是 [0.67578125, 0.296875, 0.3515625, 1.]
write_mesh
需要 face_color=True
个参数。
- .obj 文件格式不支持 vertex/face 颜色。颜色保存在单独的 .mtl 文件中 ("material")。您可以改用其他格式,即 .ply.
完整代码:
import openmesh as om
mesh = om.TriMesh()
# add a a couple of vertices to the mesh
vh0 = mesh.add_vertex([0, 1, 0])
vh1 = mesh.add_vertex([1, 0, 0])
vh2 = mesh.add_vertex([2, 1, 0])
vh3 = mesh.add_vertex([0,-1, 0])
vh4 = mesh.add_vertex([2,-1, 0])
# add a couple of faces to the mesh
fh0 = mesh.add_face(vh0, vh1, vh2)
fh1 = mesh.add_face(vh1, vh3, vh4)
fh2 = mesh.add_face(vh0, vh3, vh1)
# add another face to the mesh, this time using a list
vh_list = [vh2, vh1, vh4]
fh3 = mesh.add_face(vh_list)
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
mesh.request_face_colors()
for face in mesh.faces():
mesh.set_color(face, [0.67578125, 0.296875, 0.3515625, 1.])
for face in mesh.faces():
print(mesh.color(face))
om.write_mesh('test.obj', mesh, face_color=True)
om.write_mesh('test.ply', mesh, face_color=True)
控制台输出(颜色属性已成功添加到网格):
[0.67578125 0.296875 0.3515625 1. ]
[0.67578125 0.296875 0.3515625 1. ]
[0.67578125 0.296875 0.3515625 1. ]
[0.67578125 0.296875 0.3515625 1. ]
test.obj的内容:
# 5 vertices, 4 faces
mtllib test.mat
v 0.000000 1.000000 0.000000
v 1.000000 0.000000 0.000000
v 2.000000 1.000000 0.000000
v 0.000000 -1.000000 0.000000
v 2.000000 -1.000000 0.000000
usemtl mat0
f 1 2 3
f 2 4 5
f 1 4 2
f 3 2 5
test.mat 的内容(此文件指定 test.obj 文件中的“mat0”的含义):
newmtl mat0
Ka 0.5000 0.5000 0.5000
Kd 0.67451 0.298039 0.352941
illum 1
test.ply 的内容(单个文件中的所有内容):
ply
format ascii 1.0
element vertex 5
property float x
property float y
property float z
element face 4
property list uchar int vertex_indices
property uchar red
property uchar green
property uchar blue
end_header
0 1 0
1 0 0
2 1 0
0 -1 0
2 -1 0
3 0 1 2 172 76 90
3 1 3 4 172 76 90
3 0 3 1 172 76 90
3 2 1 4 172 76 90
OpenMesh 文档中没有为面部着色的示例。我应该使用哪个函数将 fh0 着色为绿色? (我尝试了mesh.set_color但是没有成功。你可以在代码的第二部分看到我的尝试)
import openmesh as om
import numpy as np
mesh = om.TriMesh()
# add a a couple of vertices to the mesh
vh0 = mesh.add_vertex([0, 1, 0])
vh1 = mesh.add_vertex([1, 0, 0])
vh2 = mesh.add_vertex([2, 1, 0])
vh3 = mesh.add_vertex([0,-1, 0])
vh4 = mesh.add_vertex([2,-1, 0])
# add a couple of faces to the mesh
fh0 = mesh.add_face(vh0, vh1, vh2)
fh1 = mesh.add_face(vh1, vh3, vh4)
fh2 = mesh.add_face(vh0, vh3, vh1)
# add another face to the mesh, this time using a list
vh_list = [vh2, vh1, vh4]
fh3 = mesh.add_face(vh_list)
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
for face in mesh.faces():
mesh.set_color(face, [0.67578125, 0.296875, 0.3515625])
om.write_mesh('test.obj', mesh)
但这给了我
IndexError: index 3 is out of bounds for axis 0 with size 3
如何在 OpenMesh 中为面添加颜色?
面颜色是 OpenMesh 中的标准属性之一。
To add a standard property to an entity simply use the appropriate request method.
在你的情况下它将是 mesh.request_face_colors()
。
有几个问题:
mesh.request_face_colors()
是TriMesh
对象支持存储面部颜色所必需的。mesh.set_color
需要一个 alpha 通道,所以你的颜色实际上是[0.67578125, 0.296875, 0.3515625, 1.]
write_mesh
需要face_color=True
个参数。- .obj 文件格式不支持 vertex/face 颜色。颜色保存在单独的 .mtl 文件中 ("material")。您可以改用其他格式,即 .ply.
完整代码:
import openmesh as om
mesh = om.TriMesh()
# add a a couple of vertices to the mesh
vh0 = mesh.add_vertex([0, 1, 0])
vh1 = mesh.add_vertex([1, 0, 0])
vh2 = mesh.add_vertex([2, 1, 0])
vh3 = mesh.add_vertex([0,-1, 0])
vh4 = mesh.add_vertex([2,-1, 0])
# add a couple of faces to the mesh
fh0 = mesh.add_face(vh0, vh1, vh2)
fh1 = mesh.add_face(vh1, vh3, vh4)
fh2 = mesh.add_face(vh0, vh3, vh1)
# add another face to the mesh, this time using a list
vh_list = [vh2, vh1, vh4]
fh3 = mesh.add_face(vh_list)
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
mesh.request_face_colors()
for face in mesh.faces():
mesh.set_color(face, [0.67578125, 0.296875, 0.3515625, 1.])
for face in mesh.faces():
print(mesh.color(face))
om.write_mesh('test.obj', mesh, face_color=True)
om.write_mesh('test.ply', mesh, face_color=True)
控制台输出(颜色属性已成功添加到网格):
[0.67578125 0.296875 0.3515625 1. ]
[0.67578125 0.296875 0.3515625 1. ]
[0.67578125 0.296875 0.3515625 1. ]
[0.67578125 0.296875 0.3515625 1. ]
test.obj的内容:
# 5 vertices, 4 faces
mtllib test.mat
v 0.000000 1.000000 0.000000
v 1.000000 0.000000 0.000000
v 2.000000 1.000000 0.000000
v 0.000000 -1.000000 0.000000
v 2.000000 -1.000000 0.000000
usemtl mat0
f 1 2 3
f 2 4 5
f 1 4 2
f 3 2 5
test.mat 的内容(此文件指定 test.obj 文件中的“mat0”的含义):
newmtl mat0
Ka 0.5000 0.5000 0.5000
Kd 0.67451 0.298039 0.352941
illum 1
test.ply 的内容(单个文件中的所有内容):
ply
format ascii 1.0
element vertex 5
property float x
property float y
property float z
element face 4
property list uchar int vertex_indices
property uchar red
property uchar green
property uchar blue
end_header
0 1 0
1 0 0
2 1 0
0 -1 0
2 -1 0
3 0 1 2 172 76 90
3 1 3 4 172 76 90
3 0 3 1 172 76 90
3 2 1 4 172 76 90