1 | import glm
|
---|
2 | from gui.visual.mouse import Mouse
|
---|
3 | from gui.visual.player import Player
|
---|
4 |
|
---|
5 | class Camera:
|
---|
6 | def __init__(self, player: Player) -> None:
|
---|
7 | self.position = glm.vec3(0, 0, 1)
|
---|
8 | self.pith = 10
|
---|
9 | self.yaw = 0
|
---|
10 | self.roll = 0
|
---|
11 | self.angleAroundPlayer = 0
|
---|
12 | self.player = player
|
---|
13 | self.distanceFromPlayer = 10
|
---|
14 | self.mx = 0
|
---|
15 | self.my = 0
|
---|
16 | self.scale = 1
|
---|
17 |
|
---|
18 | def setPosition(self, x, y):
|
---|
19 | self.player.position = glm.vec3(x, y, 0)
|
---|
20 |
|
---|
21 | def setZoomScale(self, scale):
|
---|
22 | self.scale = scale
|
---|
23 |
|
---|
24 | def setZoom(self, zoom):
|
---|
25 | self.distanceFromPlayer = 0.70140280561122 * zoom - 0.028056112224449 #values from linear interpolation
|
---|
26 |
|
---|
27 | def move(self):
|
---|
28 | self.calculateZoom()
|
---|
29 | self.calculatePitchAndAngleAroundPLayer()
|
---|
30 | horizontalDistance = self.calculateHorizotalDistance()
|
---|
31 | verticalDistance = self.calculateVerticalDistance()
|
---|
32 | self.calculateCameraPosition(horizontalDistance, verticalDistance)
|
---|
33 |
|
---|
34 | def calculateZoom(self):
|
---|
35 | zoomLevel = Mouse.getDWheel() * self.scale
|
---|
36 | self.distanceFromPlayer -= zoomLevel
|
---|
37 | if self.distanceFromPlayer < 0.1:
|
---|
38 | self.distanceFromPlayer = 0.1
|
---|
39 |
|
---|
40 | def calculateCameraPosition(self, horizontalDistance, verticalDistance):
|
---|
41 | theta = self.player.rotY + self.angleAroundPlayer
|
---|
42 | offsetX = horizontalDistance * glm.sin(glm.radians(theta))
|
---|
43 | offsetY = horizontalDistance * glm.cos(glm.radians(theta))
|
---|
44 | self.position.x = self.player.position.x - offsetX
|
---|
45 | self.position.y = self.player.position.y + offsetY
|
---|
46 | self.position.z = self.player.position.z + verticalDistance
|
---|
47 | yaw = 180 - theta
|
---|
48 |
|
---|
49 | def calculateHorizotalDistance(self):
|
---|
50 | return self.distanceFromPlayer * glm.cos(glm.radians(self.pith))
|
---|
51 |
|
---|
52 | def calculateVerticalDistance(self):
|
---|
53 | return self.distanceFromPlayer * glm.sin(glm.radians(self.pith))
|
---|
54 |
|
---|
55 | def calculatePitchAndAngleAroundPLayer(self):
|
---|
56 | if Mouse.isButtonDown(Mouse.MOUSE_LEFT):
|
---|
57 | dx = Mouse.getX() - self.mx
|
---|
58 | dy = Mouse.getY() - self.my
|
---|
59 | pitchChange = dy * 0.1
|
---|
60 | self.pith += pitchChange
|
---|
61 | if self.pith < -90:
|
---|
62 | self.pith = -89.99
|
---|
63 | if self.pith > 90:
|
---|
64 | self.pith = 89.99
|
---|
65 |
|
---|
66 | angleChange = dx * 0.3
|
---|
67 | self.angleAroundPlayer -= angleChange
|
---|
68 | elif Mouse.isButtonDown(Mouse.MOUSE_RIGHT):
|
---|
69 | dx = Mouse.getX() - self.mx
|
---|
70 | dy = Mouse.getY() - self.my
|
---|
71 | theta = glm.radians(self.player.rotY + self.angleAroundPlayer)
|
---|
72 | scale = self.distanceFromPlayer * 10 / 250
|
---|
73 | self.player.position.x += (dx * glm.cos(theta) + dy * glm.sin(theta)) * 0.1 * scale
|
---|
74 | self.player.position.y += (dx * glm.sin(theta) - dy * glm.cos(theta)) * 0.1 * scale
|
---|
75 | self.mx = Mouse.getX()
|
---|
76 | self.my = Mouse.getY() |
---|