geo3d 0.1.3 → 0.1.4
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 +8 -0
- data/lib/geo3d/matrix.rb +1 -1
- data/lib/geo3d/vector.rb +18 -1
- data/lib/geo3d/version.rb +1 -1
- data/spec/lib/vector_spec.rb +32 -7
- data/spec/opengl/matrix_spec.rb +6 -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: 232252be56a981c2f600a5b56cbed43329059f87
|
4
|
+
data.tar.gz: 1b0f57fc159cd4a00a57badeb0d96c1429e79d42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5080591b0755271ef5bb5f5024d81ffeeb69cb9bf7621a4ade23f4371856b0ce7c4266a6db7d5ee1e230fe9b768d4b41973314d15b0f0e26ad8e15663b787b3d
|
7
|
+
data.tar.gz: 0b5bdc014bf23de2d8551403b3fe2083c19b953edb6e45c84bf5549e2049f8ec652921ba87653bcd816e7d797f61759238914f3b436daf2ad7a503ebcd53d2d8
|
data/README.md
CHANGED
@@ -92,6 +92,14 @@ Screenspace projections
|
|
92
92
|
vec.project viewport, projection, view, world #transform an objectspace vertex to screenspace
|
93
93
|
vec.unproject viewport, projection, view, world #transform a screenspace vertex to objectspace
|
94
94
|
```
|
95
|
+
Reflections
|
96
|
+
```
|
97
|
+
vec.reflect normal, incident
|
98
|
+
```
|
99
|
+
Refractions
|
100
|
+
```
|
101
|
+
vec.refract normal, incident, index_of_refraction
|
102
|
+
```
|
95
103
|
|
96
104
|
## Matrix
|
97
105
|
|
data/lib/geo3d/matrix.rb
CHANGED
@@ -268,7 +268,7 @@ module Geo3d
|
|
268
268
|
scaling = scaling_component
|
269
269
|
return nil if scaling.x.zero? || scaling.y.zero? || scaling.z.zero?
|
270
270
|
m = Matrix.new
|
271
|
-
m._11=_11
|
271
|
+
m._11=_11/scaling.x
|
272
272
|
m._12=_12/scaling.x
|
273
273
|
m._13=_13/scaling.x
|
274
274
|
m._21=_21/scaling.y
|
data/lib/geo3d/vector.rb
CHANGED
@@ -34,7 +34,7 @@ module Geo3d
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def xyz
|
37
|
-
self.class.new x, y, z
|
37
|
+
self.class.new x, y, z, 0
|
38
38
|
end
|
39
39
|
|
40
40
|
def to_s
|
@@ -126,6 +126,23 @@ module Geo3d
|
|
126
126
|
almost_objectspace_vector = (projection * view * world).inverse * normalized_clipspace_vector.one_w
|
127
127
|
(almost_objectspace_vector / almost_objectspace_vector.w).one_w
|
128
128
|
end
|
129
|
+
|
130
|
+
def self.reflect normal, incident
|
131
|
+
s = 2.0 * normal.xyz.dot(incident.xyz)
|
132
|
+
(incident - normal * s).xyz
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.refract normal, incident, index_of_refraction
|
136
|
+
t = incident.xyz.dot normal.xyz
|
137
|
+
r = 1.0 - index_of_refraction * index_of_refraction * (1.0 - t*t)
|
138
|
+
|
139
|
+
if r < 0.0 # Total internal reflection
|
140
|
+
self.new 0, 0, 0, 0
|
141
|
+
else
|
142
|
+
s = index_of_refraction * t + Math.sqrt(r)
|
143
|
+
(incident * index_of_refraction - normal * s).xyz
|
144
|
+
end
|
145
|
+
end
|
129
146
|
end
|
130
147
|
end
|
131
148
|
|
data/lib/geo3d/version.rb
CHANGED
data/spec/lib/vector_spec.rb
CHANGED
@@ -21,10 +21,10 @@ describe Geo3d::Vector do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should support cross products with other vectors" do
|
24
|
-
[{:a => [1,0,0,0], :b => [0,1,0,0], :expected => [0,0,1,0]
|
25
|
-
{:a => [1,0,0,1], :b => [0,1,0,1], :expected => [0,0,1,0]
|
26
|
-
{:a => [1,1,1,1], :b => [1,1,1,1], :expected => [0,0,0,0]
|
27
|
-
{:a => [2,99,6,0], :b => [-11
|
24
|
+
[{:a => [1, 0, 0, 0], :b => [0, 1, 0, 0], :expected => [0, 0, 1, 0]},
|
25
|
+
{:a => [1, 0, 0, 1], :b => [0, 1, 0, 1], :expected => [0, 0, 1, 0]},
|
26
|
+
{:a => [1, 1, 1, 1], :b => [1, 1, 1, 1], :expected => [0, 0, 0, 0]},
|
27
|
+
{:a => [2, 99, 6, 0], :b => [-11, -91, 77, 0], :expected => [8169.000000, -220.000000, 907.000000, 0.000000]}].each do |data|
|
28
28
|
a = Geo3d::Vector.new *data[:a]
|
29
29
|
b = Geo3d::Vector.new *data[:b]
|
30
30
|
expected = Geo3d::Vector.new *data[:expected]
|
@@ -64,13 +64,38 @@ describe Geo3d::Vector do
|
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should be able to linearly interpolate" do
|
67
|
-
[{:a => [0,0,0,0], :b => [1,1,1,1], :interpolate_fraction => 0.5, :expected => [0.5, 0.5, 0.5, 0.5]},
|
68
|
-
{:a => [23
|
67
|
+
[{:a => [0, 0, 0, 0], :b => [1, 1, 1, 1], :interpolate_fraction => 0.5, :expected => [0.5, 0.5, 0.5, 0.5]},
|
68
|
+
{:a => [23, -3, 425, -332], :b => [-22, -45443, 886, 122], :interpolate_fraction => 0.21234433, :expected => [13.444505, -9651.926758, 522.890747, -235.595673]}].each do |data|
|
69
69
|
a = Geo3d::Vector.new *data[:a]
|
70
70
|
b = Geo3d::Vector.new *data[:b]
|
71
71
|
expected = Geo3d::Vector.new *data[:expected]
|
72
72
|
s = data[:interpolate_fraction]
|
73
|
-
a.lerp(
|
73
|
+
a.lerp(b, s).should == expected
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should calculate reflection" do
|
78
|
+
[{:normal => [0, 1, 0], :incident => [1, 1, 0], :expected => [1, -1, 0]},
|
79
|
+
{:normal => [0, 1, 0], :incident => [0, -1, 0], :expected => [0, 1, 0]},
|
80
|
+
{:normal => [22, 33, 68], :incident => [65, -23, -23], :expected => [39357.000000, 58915.000000, 121425.000000, 0.000000]}].each do |data|
|
81
|
+
normal = Geo3d::Vector.new *data[:normal]
|
82
|
+
incident = Geo3d::Vector.new *data[:incident]
|
83
|
+
expected = Geo3d::Vector.new *data[:expected]
|
84
|
+
Geo3d::Vector.reflect(normal, incident).should == expected
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should calculate refraction" do
|
89
|
+
[{:normal => [0, 1, 0], :incident => [1, 1, 0], :index_of_ref => 0.5, :expected => [0.5, -1, 0]},
|
90
|
+
{:normal => [0, 1, 0], :incident => [0, -1, 0], :index_of_ref => 21.345, :expected => [0, -1, 0]},
|
91
|
+
{:normal => [22, 33, 68], :incident => [65, -23, -23], :index_of_ref => 17.5678, :expected => [1142.121826, -403.737152, -403.395355]},
|
92
|
+
{:normal => [1, 0, 0], :incident => [0, 1, 0], :index_of_ref => 0.75, :expected => [-0.661438, 0.750000, 0.000000, 0.000000]}
|
93
|
+
].each do |data|
|
94
|
+
|
95
|
+
normal = Geo3d::Vector.new *data[:normal]
|
96
|
+
incident = Geo3d::Vector.new *data[:incident]
|
97
|
+
expected = Geo3d::Vector.new *data[:expected]
|
98
|
+
Geo3d::Vector.refract(normal, incident, data[:index_of_ref]).should == expected
|
74
99
|
end
|
75
100
|
end
|
76
101
|
|
data/spec/opengl/matrix_spec.rb
CHANGED
@@ -34,6 +34,12 @@ describe Geo3d::Matrix do
|
|
34
34
|
# raise "opengl not able to initialize" unless @gl_initialized
|
35
35
|
end
|
36
36
|
|
37
|
+
it "the identity constructor should be functionally equivalent to glLoadIdentity" do
|
38
|
+
glMatrixMode GL_MODELVIEW
|
39
|
+
glLoadIdentity
|
40
|
+
gl_version = Geo3d::Matrix.new *glGetFloatv(GL_MODELVIEW_MATRIX).flatten
|
41
|
+
Geo3d::Matrix.identity.should == gl_version
|
42
|
+
end
|
37
43
|
|
38
44
|
it "the right handed view constructor should be functionally equivalent to gluLookAt" do
|
39
45
|
[{:eye => [1, 0, 0], :focus => [100, 0, -100], :up => [0, 1, 0]}].each do |data|
|
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.1.
|
4
|
+
version: 0.1.4
|
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-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|