This package is provides convenient ways to define and use perspective and
orthographic cameras in 3D. It is based on elm-geometry
and has two main goals:
elm-community/linear-algebra
directlyTo define a camera, you first create a viewpoint which represents the position and orientation of the camera:
cameraViewpoint =
Viewpoint3d.lookAt
{ eyePoint = Point3d.fromCoordinates ( 10, 0, 5 )
, focalPoint = Point3d.origin
, upDirection = Direction3d.positiveZ
}You can then create either a perspective or orthographic camera from the viewpoint:
perspectiveCamera =
Camera3d.perspective
{ viewpoint = cameraViewpoint
, verticalFieldOfView = degrees 30
, nearClipDistance = 0.1
, farClipDistance = 1000
, screenWidth = 1024
, screenHeight = 768
}
orthographicCamera =
Camera3d.orthographic
{ viewpoint = cameraViewpoint
, viewportHeight = 5
, nearClipDistance = 0.1
, farClipDistance = 1000
, screenWidth = 1024
, screenHeight = 768
}Once you have a camera, you can use it to get WebGL model/view/projection matrices:
projectionMatrix =
Camera.projectionMatrix camera
viewMatrix =
Camera.viewMatrix camera
modelViewProjectionMatrix =
Camera3d.modelViewProjectionMatrix modelFrame camera(In the final example, the position and orientation of the object to be
rendered is defined by an elm-geometry Frame3d
value.)
You can also use a Camera3d to project points, lines, triangles and polylines
from 3D to 2D:
import Point3d.Projection as Point3d
import LineSegment3d.Projection as LineSegment3d
point2d =
point3d |> Point3d.toScreenSpace camera
lineSegment2d =
lineSegment3d |> LineSegment3d.toScreenSpace cameraThis allows you to, for example, do a perspective projection of 3D points and lines into 2D so that those points and lines can be rendered with SVG (taking advantage of SVG features like perfect circles and dashed lines which are difficult to do with WebGL):

Several more features are planned:
Viewpoint3d constructors other than just lookAtPlease open a new issue if you
run into a bug, if any documentation is missing/incorrect/confusing, or if
there's a new feature that you would find useful. For general questions about
using elm-3d-camera, try:
You can also find me on Twitter (@ianemackenzie),
where I occasionally post elm-geometry-related stuff like demos or new
releases. Have fun, and don't be afraid to ask for help!