File size: 1,989 Bytes
5db43ff |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
import pyrender
import numpy as np
class PerspectiveCamera:
def __init__(self,model,view,projection):
self.model = model.transpose()
self.view = view.transpose()
self.projection = projection.transpose()
self.transform = self.projection@self.view@self.model#np.matmul(self.projection,self.view,self.model)
def projection_to_screen(self, v, width=512, height=512):
point = np.array([v[0], v[1], v[2], 1.0], dtype=v.dtype)
projected_point = self.transform@np.expand_dims(point,1)
projected_point /= projected_point[3]
x, y = projected_point[0], projected_point[1]
#print('---------')
#print(x, y)
id_x = int(((x + 1) / 2) * width)
id_y = int(((1 - y) / 2) * height)
#print(id_x, id_y)
return id_x, id_y
class WeakPerspectiveCamera(pyrender.Camera):
def __init__(self,
scale,
translation,
znear=pyrender.camera.DEFAULT_Z_NEAR,
zfar=None,
name=None):
super(WeakPerspectiveCamera, self).__init__(
znear=znear,
zfar=zfar,
name=name,
)
self.scale = scale
self.translation = translation
self.P = self.get_projection_matrix()
def get_projection_matrix(self, width=None, height=None):
P = np.eye(4)
P[0, 0] = self.scale[0]
P[1, 1] = self.scale[1]
P[0, 3] = self.translation[0] * self.scale[0]
P[1, 3] = -self.translation[1] * self.scale[1]
P[2, 2] = -1
return P
def projection_to_screen(self, v, width=512, height=512):
point = np.array([v[0], v[1], v[2], 1.0], dtype=v.dtype)
projected_point = self.P.dot(point)
projected_point /= projected_point[3]
x, y = projected_point[0], projected_point[1]
id_x = int(((x + 1) / 2) * width)
id_y = int(((1 - y) / 2) * height)
return id_x, id_y
|