Skip to content

Commit

Permalink
merged ortho camera from
Browse files Browse the repository at this point in the history
  • Loading branch information
apaoluzzi committed Jul 11, 2019
1 parent ec5b95f commit 0ac2c54
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 43 deletions.
2 changes: 1 addition & 1 deletion examples/Points.jl
Expand Up @@ -3,6 +3,6 @@ GL = ViewerGL

points = rand(1000,3)
GL.VIEW([
GL.GLAxis(GL.Point3d(0,0,0),GL.Point3d(1,1,1))
GL.GLFrame,
GL.GLPoints(points)
]);
17 changes: 7 additions & 10 deletions src/Frustum.jl
Expand Up @@ -28,13 +28,13 @@ mutable struct FrustumMap

# constructor
function FrustumMap(viewport,projection::Matrix4,modelview::Matrix4)
x,y,z,h = viewport
viewport_T=Matrix4(
viewport[3] / 2.0, 0, 0, viewport[1] + viewport[3] / 2.0,
0, viewport[4] / 2.0, 0, viewport[2] + viewport[4] / 2.0,
0, 0, 1 / 2.0, 1 / 2.0,
0, 0, 0, 1)
#new(viewport_T,projection,modelview,inv(ret.viewport),inv(ret.projection),inv(ret.modelview))
ret = new(viewport_T,projection,modelview,inv(viewport_T),inv(projection),inv(modelview))
w/2.0, 0.0, 0.0, x+w/2.0,
0.0, h/2.0, 0.0, y+h/2.0,
0.0, 0.0, 1/2.0, 1/2.0,
0.0, 0.0, 0.0, 1.0)
new(viewport_T,projection,modelview,inv(viewport_T),inv(projection),inv(modelview))
end

end
Expand All @@ -59,10 +59,7 @@ end
Return in 3D world coordinates a `GL.Point3d`, given in 3D screen coordinates.
Use the inverse matrices of viewing transformation, contained in `map::FrustumMap`.
"""
function unprojectPoint(map::FrustumMap,x::Float32,y::Float32, z::Float32)
function unprojectPoint(map::FrustumMap,x::Float64,y::Float64, z::Float64)
p4 = (map.inv_modelview * (map.inv_projection * (map.inv_viewport * Point4d(x,y,z, 1.0))))
if p4.w==0
p4.w=1
end
return Point3d(p4[1]/p4[4],p4[2]/p4[4],p4[3]/p4[4])
end
31 changes: 21 additions & 10 deletions src/Matrix.jl
@@ -1,3 +1,4 @@
using LinearAlgebra

"""
Construct a statically-sized, mutable array of dimensions S (expressed as a Tuple{...}) using the data from a.
Expand Down Expand Up @@ -204,16 +205,26 @@ Generation of the perspective matrix. Using 4 real parameters:
- `zFar::Float64` is a positive number in clip space.
"""
function perspectiveMatrix(fovy::Float64, aspect::Float64, zNear::Float64, zFar::Float64)
radians = deg2rad(fovy/2.0)
cotangent = cos(radians) / sin(radians)
m=Matrix4()
m[1,1] = cotangent / aspect
m[2,2] = cotangent
m[3,3] = -(zFar + zNear) / (zFar - zNear)
m[3,4] = -1.0
m[4,3] = -2.0 * zNear * zFar / (zFar - zNear)
m[4,4] = 0.0
return transpose(m)
radians = deg2rad(fovy/2.0)
cotangent = cos(radians) / sin(radians)
m=Matrix4()
m[1,1] = cotangent / aspect
m[2,2] = cotangent
m[3,3] = -(zFar + zNear) / (zFar - zNear)
m[3,4] = -1.0
m[4,3] = -2.0 * zNear * zFar / (zFar - zNear)
m[4,4] = 0.0
return transpose(m)
end


function orthoMatrix(left::Float64, right::Float64, bottom::Float64, top::Float64, nearZ::Float64, farZ::Float64)
m=Matrix4()
m[1,1] = 2 / (right-left); m[1,2] = 0; m[1,3] = 0; m[1,4] = -(right+left) / (right-left)
m[2,1] = 0; m[2,2] = 2 / (top-bottom); m[2,3] = 0; m[2,4] = -(top+bottom) / (top-bottom)
m[3,1] = 0; m[3,2] = 0; m[3,3] = -2 / (farZ-nearZ); m[3,4] = -(farZ+nearZ) / (farZ-nearZ)
m[4,1] = 0; m[4,2] = 0; m[4,3] = 0; m[4,4] = 1
return m
end


Expand Down
63 changes: 41 additions & 22 deletions src/Viewer.jl
Expand Up @@ -41,11 +41,11 @@ mutable struct Viewer
down_button::Int32
meshes::Any
shaders::Dict
exitNow::Int32
use_ortho:: Bool

# constructor
function Viewer(meshes)
new(0,1024,768,1.0,1.0, 60.0, Point3d(), Point3d(), Point3d(), 0.0, 0.0, 0.0, 0,0,0, meshes,Dict())
new(0,1024,768,1.0,1.0, 60.0, Point3d(), Point3d(), Point3d(), 0.0, 0.0, 0.0, 0,0,0, meshes,Dict(),false)
end

end
Expand Down Expand Up @@ -200,7 +200,7 @@ function VIEW(meshes,view=true)
maxsize = 2.0
viewer.zNear = maxsize / 50.0
viewer.zFar = maxsize * 10.0
viewer.walk_speed = maxsize / 500.0
viewer.walk_speed = maxsize / 100.0
if view==true
GL.redisplay(viewer)
GL.runViewer(viewer)
Expand Down Expand Up @@ -267,9 +267,18 @@ julia> GL.getProjection(GL.viewer) # `GL.viewer` global variable set by `GL.VIE
```
"""
function getProjection(viewer::Viewer)
return perspectiveMatrix(viewer.fov,viewer.W/float(viewer.H),viewer.zNear,viewer.zFar)
end
ratio=viewer.W/float(viewer.H)
if viewer.use_ortho
# euristic that seem to work well
Z=viewer.zNear + 0.5*(viewer.zFar - viewer.zNear)
right=Z * tan(deg2rad(viewer.fov/2.0))
left=-right
return orthoMatrix(left, right, -0.5*(right-left)/ratio, +0.5*(right-left)/ratio, viewer.zNear, viewer.zFar)
else
return perspectiveMatrix(viewer.fov,ratio,viewer.zNear,viewer.zFar)
end

end


"""
Expand Down Expand Up @@ -304,7 +313,7 @@ end
Inverse projection of a 2D point in screen coordinates.
"""
function unprojectPoint(viewer::Viewer,x::Float32,y::Float32)
function unprojectPoint(viewer::Viewer,x::Float64,y::Float64)
viewport=[0,0,viewer.W,viewer.H]
projection =getProjection(viewer)
modelview=getModelview(viewer)
Expand Down Expand Up @@ -561,7 +570,7 @@ Helper GLFW function to handle the Key Press Event.
"""
function handleKeyPressEvent(viewer,key, scancode, action, mods)

if action != GLFW.PRESS
if action != GLFW.PRESS && action != GLFW.REPEAT
return
end

Expand All @@ -572,43 +581,38 @@ function handleKeyPressEvent(viewer,key, scancode, action, mods)
return
end

if (key=="+" || key=="=")
if (key==GLFW.KEY_KP_ADD)
viewer.walk_speed*=0.95
return
end

if (key=='-' || key=="=")
if (key==GLFW.KEY_KP_SUBTRACT)
viewer.walk_speed*=(1.0/0.95)
return
end

if (key=='w')
dir=unproject(viewer,x,y)
if (key==GLFW.KEY_W)
dir=unprojectPoint(viewer,0.5*viewer.W,0.5*viewer.H)
println("dir",dir,"walk_speed",viewer.walk_speed)
viewer.pos=viewer.pos+dir*viewer.walk_speed
redisplay(viewer)
return
end

if (key=='s')
dir=unproject(viewer,x,y)
if (key==GLFW.KEY_S)
dir=unprojectPoint(viewer,0.5*viewer.W,0.5*viewer.H)
viewer.pos=viewer.pos-dir*viewer.walk_speed
redisplay(viewer)
return
end

if (key=='a' || key==GLFW.KEY_LEFT)
right=normalized(cross(viewer.dir,viewer.vup))
viewer.pos=viewer.pos-right*viewer.walk_speed
if (key==GLFW.KEY_O)
viewer.use_ortho=!viewer.use_ortho
println("use_ortho ",viewer.use_ortho)
redisplay(viewer)
return
end

if (key=='d' || key==GLFW.KEY_RIGHT)
right=normalized(cross(viewer.dir,viewer.vup))
viewer.pos=viewer.pos+right*viewer.walk_speed
redisplay(viewer)
return
end

if (key==GLFW.KEY_UP)
viewer.pos=viewer.pos+viewer.vup*viewer.walk_speed
Expand All @@ -621,6 +625,21 @@ function handleKeyPressEvent(viewer,key, scancode, action, mods)
redisplay(viewer)
return
end

if (key==GLFW.KEY_LEFT || key==GLFW.KEY_A)
right=normalized(cross(viewer.dir,viewer.vup))
viewer.pos=viewer.pos-right*viewer.walk_speed
redisplay(viewer)
return
end

if (key==GLFW.KEY_RIGHT || key==GLFW.KEY_D)
right=normalized(cross(viewer.dir,viewer.vup))
viewer.pos=viewer.pos+right*viewer.walk_speed
redisplay(viewer)
return
end

end


Expand Down
15 changes: 15 additions & 0 deletions test/GeometryAPI.jl
@@ -0,0 +1,15 @@
function GLHull(points::Array{Float64,2},color::GL.Point4d)::GL.GLMesh
function GLHull(points::Array{Float64,2})::GL.GLMesh
function GLHull2d(points::Array{Float64,2})::GL.GLMesh # points by row
function GLHulls(V::Array{Float64,2},
function GLPolygon(V::Lar.Points,copEV::Lar.ChainOp,copFE::Lar.ChainOp)::GL.GLMesh
function GLPolygon(V::Lar.Points,EV::Lar.Cells)::GL.GLMesh
function GLLar2gl(V::Lar.Points, CV::Lar.Cells)::GL.GLMesh
function GLLines(points::Lar.Points,lines::Lar.Cells,color=COLORS[12])::GL.GLMesh
function GLPoints(points::Lar.Points,color=COLORS[12])::GL.GLMesh # points by row
function GLPolyhedron(V::Lar.Points, FV::Lar.Cells, T::GL.Matrix4=M44)::GL.GLMesh
function GLPolyhedron(V::Lar.Points,
function GLGrid(V::Lar.Points,CV::Lar.Cells,color=GL.COLORS[1])::GL.GLMesh
function GLExplode(V,FVs,sx=1.2,sy=1.2,sz=1.2,colors=1)


0 comments on commit 0ac2c54

Please sign in to comment.