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