geo3d 0.0.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +14 -2
- data/lib/geo3d/version.rb +1 -1
- data/lib/matrix.rb +14 -9
- data/lib/vector.rb +12 -0
- data/spec/opengl/matrix_spec.rb +40 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41c051605a8dd60b857e28eb5cd761dee1945f71
|
4
|
+
data.tar.gz: 5637c0862c56ad4f92f3491575b866c0e4719713
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 140091ea429a7e8385668e197194b1300b83c0eefe2a9306699f85208be9e94c81aa06b936dd8eb81db2f98e69a2af16c0cde94200b0a3acadc5a5e55c83c1f7
|
7
|
+
data.tar.gz: 57abc21c5d11b25311eca919b83d0b201bf695faf5c50465eac9fd29c63fb22d005520f200175f0dc4468ea9e8e58c6d112dbe96cfeca38a3fbaae42df51895a
|
data/README.md
CHANGED
@@ -87,7 +87,11 @@ Linear Interpolation
|
|
87
87
|
```
|
88
88
|
vec_a.lerp vec_b, 0.4 #returns a new vector which is the 40% linear interpolation between vec_a and vec_b
|
89
89
|
```
|
90
|
-
|
90
|
+
Screenspace projections
|
91
|
+
```
|
92
|
+
vec.project viewport, projection, view, world #transform an objectspace vertex to screenspace
|
93
|
+
vec.unproject viewport, projection, view, world #transform a screenspace vertex to objectspace
|
94
|
+
```
|
91
95
|
|
92
96
|
## Matrix
|
93
97
|
|
@@ -160,18 +164,26 @@ Rotation
|
|
160
164
|
angle = 0.9
|
161
165
|
Geo3d::Matrix.rotation axis, angle #rotate about an arbitrary axis
|
162
166
|
```
|
163
|
-
Projection matrix constructors
|
167
|
+
Projection matrix constructors ala Direct3D (clip space has a range of 0 to 1)
|
164
168
|
```
|
165
169
|
Geo3d::Matrix.perspective_fov_rh fovy, aspect, z_near, z_far #returns a right handed perspective projection matrix
|
166
170
|
Geo3d::Matrix.perspective_fov_lh fovy, aspect, z_near, z_far #returns a left handed perspective projection matrix
|
167
171
|
Geo3d::Matrix.ortho_off_center_rh left, right, bottom, top, z_near, z_far #returns a right handed orthographic projection matrix
|
168
172
|
Geo3d::Matrix.ortho_off_center_lh left, right, bottom, top, z_near, z_far #returns a left handed orthographic projection matrix
|
169
173
|
```
|
174
|
+
Projection matrix constructors ala OpenGL (clip space has a range of -1 to 1)
|
175
|
+
```
|
176
|
+
Geo3d::Matrix.glu_perspective_degrees fovy, aspect, zn, zf #returns an opengl style right handed projection matrix
|
177
|
+
```
|
170
178
|
View matrix constructors
|
171
179
|
```
|
172
180
|
Geo3d::Matrix.look_at_rh eye_position, look_at_position, up_direction #returns a right handed view matrix
|
173
181
|
Geo3d::Matrix.look_at_lh eye_position, look_at_position, up_direction #returns a left handed view matrix
|
174
182
|
```
|
183
|
+
Viewport matrix constructors
|
184
|
+
```
|
185
|
+
Geo3d::Matrix.viewport x, y, width, height
|
186
|
+
```
|
175
187
|
Misc constructors
|
176
188
|
```
|
177
189
|
Geo3d::Matrix.reflection reflection_plane #returns a reflection matrix where reflection_plane is a Geo3d::Vector that corresponds to the normal of the plane
|
data/lib/geo3d/version.rb
CHANGED
data/lib/matrix.rb
CHANGED
@@ -471,7 +471,7 @@ module Geo3d
|
|
471
471
|
matrix = self.new
|
472
472
|
matrix._11 = 2.0 * zn / (r-l)
|
473
473
|
matrix._31 = a
|
474
|
-
matrix._22 =
|
474
|
+
matrix._22 = zn / (t-b) #todo: the man page says multiply this by two, but I don't actually match what glFrustum does if I do
|
475
475
|
matrix._32 = b
|
476
476
|
matrix._33 = c
|
477
477
|
matrix._43 = d
|
@@ -609,6 +609,11 @@ module Geo3d
|
|
609
609
|
matrix
|
610
610
|
end
|
611
611
|
|
612
|
+
|
613
|
+
def self.viewport x, y, width, height
|
614
|
+
self.scaling(width.to_f / 2.0, height.to_f / 2.0, 0.5) * self.translation(x.to_f + width.to_f / 2.0, y.to_f + height.to_f / 2.0, 0.5)
|
615
|
+
end
|
616
|
+
|
612
617
|
def self.reflection reflection_plane
|
613
618
|
reflection_plane = Geo3d::Vector.new *reflection_plane.to_a
|
614
619
|
reflection_matrix = self.new
|
@@ -673,20 +678,20 @@ module Geo3d
|
|
673
678
|
|
674
679
|
def self.translation x, y, z
|
675
680
|
translation_matrix = self.new
|
676
|
-
translation_matrix._11 = translation_matrix._22 = translation_matrix._33 = translation_matrix._44 = 1
|
681
|
+
translation_matrix._11 = translation_matrix._22 = translation_matrix._33 = translation_matrix._44 = 1.0
|
677
682
|
#todo: consider simplifying with identity
|
678
|
-
translation_matrix._41 = x
|
679
|
-
translation_matrix._42 = y
|
680
|
-
translation_matrix._43 = z
|
683
|
+
translation_matrix._41 = x.to_f
|
684
|
+
translation_matrix._42 = y.to_f
|
685
|
+
translation_matrix._43 = z.to_f
|
681
686
|
translation_matrix
|
682
687
|
end
|
683
688
|
|
684
689
|
def self.scaling x, y, z
|
685
690
|
scaling_matrix = self.new
|
686
|
-
scaling_matrix._11 = x
|
687
|
-
scaling_matrix._22 = y
|
688
|
-
scaling_matrix._33 = z
|
689
|
-
scaling_matrix._44 = 1
|
691
|
+
scaling_matrix._11 = x.to_f
|
692
|
+
scaling_matrix._22 = y.to_f
|
693
|
+
scaling_matrix._33 = z.to_f
|
694
|
+
scaling_matrix._44 = 1.0
|
690
695
|
scaling_matrix
|
691
696
|
end
|
692
697
|
|
data/lib/vector.rb
CHANGED
@@ -114,6 +114,18 @@ module Geo3d
|
|
114
114
|
l.w = w + (vec.w - w)*s
|
115
115
|
l
|
116
116
|
end
|
117
|
+
|
118
|
+
def project viewport, projection, view, world
|
119
|
+
clipspace_vector = projection * view * world * one_w
|
120
|
+
normalized_clipspace_vector = (clipspace_vector / clipspace_vector.w.to_f).one_w
|
121
|
+
viewport * normalized_clipspace_vector
|
122
|
+
end
|
123
|
+
|
124
|
+
def unproject viewport, projection, view, world
|
125
|
+
normalized_clipspace_vector = viewport.inverse * one_w
|
126
|
+
almost_objectspace_vector = (projection * view * world).inverse * normalized_clipspace_vector.one_w
|
127
|
+
(almost_objectspace_vector / almost_objectspace_vector.w).one_w
|
128
|
+
end
|
117
129
|
end
|
118
130
|
end
|
119
131
|
|
data/spec/opengl/matrix_spec.rb
CHANGED
@@ -91,5 +91,45 @@ describe Geo3d::Matrix do
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
it "should project a vector the same way gluProject does" do
|
95
|
+
viewport_data = {:x => 0, :y => 0, :width => 640, :height => 480}
|
96
|
+
projection_data = {:fovy_in_degrees => 60.0, :width => 640.0, :height => 480.0, :near => 0.1, :far => 1000.0}
|
97
|
+
view_data = {:eye => [1.0, 0.0, 0.0], :focus => [200.0, -40.0, -100.0], :up => [0.0, 1.0, 0.0]}
|
98
|
+
eye = Geo3d::Vector.new *view_data[:eye]
|
99
|
+
focus = Geo3d::Vector.new *view_data[:focus]
|
100
|
+
up = Geo3d::Vector.new *view_data[:up]
|
101
|
+
|
102
|
+
|
103
|
+
viewport_matrix = Geo3d::Matrix.viewport viewport_data[:x], viewport_data[:y], viewport_data[:width], viewport_data[:height]
|
104
|
+
projection_matrix = Geo3d::Matrix.glu_perspective_degrees(projection_data[:fovy_in_degrees], projection_data[:width].to_f/projection_data[:height].to_f, projection_data[:near], projection_data[:far])
|
105
|
+
view_matrix = Geo3d::Matrix.look_at_rh(eye, focus, up)
|
106
|
+
|
107
|
+
vector = Geo3d::Vector.new 300, 100, -500
|
108
|
+
|
109
|
+
glu_vector = gluProject vector.x, vector.y, vector.z, projection_matrix.to_a, view_matrix.to_a, [viewport_data[:x], viewport_data[:y], viewport_data[:width], viewport_data[:height]]
|
110
|
+
|
111
|
+
puts "glu vect is #{glu_vector.inspect}"
|
112
|
+
Geo3d::Vector.new(*glu_vector).should == vector.project(viewport_matrix, projection_matrix, view_matrix, Geo3d::Matrix.identity).zero_w
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should unproject a vector the same way gluUnproject does" do
|
116
|
+
viewport_data = {:x => 0, :y => 0, :width => 640, :height => 480}
|
117
|
+
projection_data = {:fovy_in_degrees => 60.0, :width => 640.0, :height => 480.0, :near => 0.1, :far => 1000.0}
|
118
|
+
view_data = {:eye => [1.0, 0.0, 0.0], :focus => [200.0, -40.0, -100.0], :up => [0.0, 1.0, 0.0]}
|
119
|
+
eye = Geo3d::Vector.new *view_data[:eye]
|
120
|
+
focus = Geo3d::Vector.new *view_data[:focus]
|
121
|
+
up = Geo3d::Vector.new *view_data[:up]
|
122
|
+
|
123
|
+
|
124
|
+
viewport_matrix = Geo3d::Matrix.viewport viewport_data[:x], viewport_data[:y], viewport_data[:width], viewport_data[:height]
|
125
|
+
projection_matrix = Geo3d::Matrix.glu_perspective_degrees(projection_data[:fovy_in_degrees], projection_data[:width].to_f/projection_data[:height].to_f, projection_data[:near], projection_data[:far])
|
126
|
+
view_matrix = Geo3d::Matrix.look_at_rh(eye, focus, up)
|
127
|
+
|
128
|
+
vector = Geo3d::Vector.new 574.1784279190967, 294.42147391181595, 0.8485367205965038
|
129
|
+
|
130
|
+
glu_vector = gluUnProject vector.x, vector.y, vector.z, projection_matrix.to_a, view_matrix.to_a, [viewport_data[:x], viewport_data[:y], viewport_data[:width], viewport_data[:height]]
|
131
|
+
Geo3d::Vector.new(*glu_vector).should == vector.unproject(viewport_matrix, projection_matrix, view_matrix, Geo3d::Matrix.identity).zero_w
|
132
|
+
end
|
133
|
+
|
94
134
|
|
95
135
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geo3d
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Misha Conway
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|