EasyMocap/code/visualize/geometry.py
2021-01-25 19:37:23 +08:00

83 lines
3.0 KiB
Python

'''
@ Date: 2021-01-17 22:44:34
@ Author: Qing Shuai
@ LastEditors: Qing Shuai
@ LastEditTime: 2021-01-25 19:14:20
@ FilePath: /EasyMocapRelease/code/visualize/geometry.py
'''
import numpy as np
import cv2
import numpy as np
def create_ground(
center=[0, 0, 0], xdir=[1, 0, 0], ydir=[0, 1, 0], # 位置
step=1, xrange=10, yrange=10, # 尺寸
white=[1., 1., 1.], black=[0.,0.,0.], # 颜色
two_sides=True
):
if isinstance(center, list):
center = np.array(center)
xdir = np.array(xdir)
ydir = np.array(ydir)
xdir = xdir * step
ydir = ydir * step
vertls, trils, colls = [],[],[]
cnt = 0
min_x = -xrange if two_sides else 0
min_y = -yrange if two_sides else 0
for i in range(min_x, xrange+1):
for j in range(min_y, yrange+1):
point0 = center + i*xdir + j*ydir
point1 = center + (i+1)*xdir + j*ydir
point2 = center + (i+1)*xdir + (j+1)*ydir
point3 = center + (i)*xdir + (j+1)*ydir
if (i%2==0 and j%2==0) or (i%2==1 and j%2==1):
col = white
else:
col = black
vert = np.stack([point0, point1, point2, point3])
col = np.stack([col for _ in range(vert.shape[0])])
tri = np.array([[2, 3, 0], [0, 1, 2]]) + vert.shape[0] * cnt
cnt += 1
vertls.append(vert)
trils.append(tri)
colls.append(col)
vertls = np.vstack(vertls)
trils = np.vstack(trils)
colls = np.vstack(colls)
return {'vertices': vertls, 'faces': trils, 'colors': colls, 'name': 'ground'}
def get_rotation_from_two_directions(direc0, direc1):
direc0 = direc0/np.linalg.norm(direc0)
direc1 = direc1/np.linalg.norm(direc1)
rotdir = np.cross(direc0, direc1)
if np.linalg.norm(rotdir) < 1e-2:
return np.eye(3)
rotdir = rotdir/np.linalg.norm(rotdir)
rotdir = rotdir * np.arccos(np.dot(direc0, direc1))
rotmat, _ = cv2.Rodrigues(rotdir)
return rotmat
def create_plane(normal, point, width=1, height=1, depth=0.005):
mesh_box = TriangleMesh.create_box(width=2*width, height=2*height, depth=2*depth)
mesh_box.paint_uniform_color([0.8, 0.8, 0.8])
# 根据normal计算旋转
rotmat = get_rotation_from_two_directions(np.array([0, 0, 1]), normal[0])
transform0 = np.eye(4)
transform0[0, 3] = -width
transform0[1, 3] = -height
transform0[2, 3] = -depth
transform = np.eye(4)
transform[:3, :3] = rotmat
transform[0, 3] = point[0, 0]
transform[1, 3] = point[0, 1]
transform[2, 3] = point[0, 2]
mesh_box.transform(transform @ transform0)
return {'vertices': np.asarray(mesh_box.vertices), 'faces': np.asarray(mesh_box.triangles), 'colors': np.asarray(mesh_box.vertex_colors), 'name': 'ground'}
faces = np.loadtxt('./code/visualize/sphere_faces_20.txt', dtype=np.int)
vertices = np.loadtxt('./code/visualize/sphere_vertices_20.txt')
colors = np.ones((vertices.shape[0], 3))
return {'vertices': vertices, 'faces': faces, 'colors': colors, 'name': 'ground'}