summaryrefslogtreecommitdiffstats
path: root/doc/src/camera-frustum.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/camera-frustum.qdoc')
-rw-r--r--doc/src/camera-frustum.qdoc240
1 files changed, 0 insertions, 240 deletions
diff --git a/doc/src/camera-frustum.qdoc b/doc/src/camera-frustum.qdoc
deleted file mode 100644
index 789f9ad9..00000000
--- a/doc/src/camera-frustum.qdoc
+++ /dev/null
@@ -1,240 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation ([email protected])
-**
-** This file is part of the QtQuick3D documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** GNU Free Documentation License
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms
-** and conditions contained in a signed written agreement between you
-** and Nokia.
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \ingroup qt3d
- \ingroup qt3d::math
- \since 4.8
- \title Camera and View Frustum
- \page qt3d-camera-frustum.html
- \keyword Camera View Frustum
- \brief Basis for the vamera and view frustum culling test.
-
- The QGLCamera class provides useful viewing functionality, such as being able
- to position and orient view point within a scene. In combination with the
- QGLPainter::isCullable() function, basic view frustum culling is available.
- To understand in more depth these concepts, or to verify the implementation
- more details of these are presented here. To simply use the functionality
- read the documentation.
-
- \list
- \o QGLCamera
- \o QGLPainter::isCullable()
- \endlist
-
- \section1 The Default Camera
-
- Qt3D uses the OpenGL co-ordinate system, that is a right-handed system. In
- this system you can think of X as pointing to the right, Y as pointing up and
- Z as pointing toward you. If you hold your right-hand so that the thumb,
- index and middle fingers are all at right angles to each other, then
-
- \list
- \o Thumb - X axis - points to the right
- \o Index - Y axis - points upward
- \o Middle - Z axis - points toward you
- \endlist
-
- When you first create a QGLCamera object, by default it has
- \code
- QGLCamera camera;
- qDebug() camera;
- --
- // displays:
- QGLCamera
- projection: Perspective -- viewsize: 2 x 2
- near-plane: 5 -- far-plane: 1000 -- field-of-view: 0
- rotation: 0 -- motion adjust: QVector3D(0, 0, 1) -- aspect adjust: true
- eye: QVector3D(0, 0, 10) -- center: QVector3D(0, 0, 0) -- up: QVector3D(0, 1, 0)
- \endcode
-
- In the visualisation just mentioned, with positive Z pointing toward you the
- camera is sitting at the tip of your middle finger, looking in the same
- direction you are, that is down toward the negative end of the Z axis.
-
- \section1 Positioning a Custom Camera.
-
- In this image we have a camera positioned with the following settings:
- \code
- camera.setNearPlane(2.2f);
- camera.setFarPlane(14.0f);
- camera.setViewSize(QSizeF(1.257f, 1.257f));
- camera.setEye(QVector3D(0, 0, -8.0f));
- \endcode
-
- This screen capture from a 3D modelling program shows how this camera is
- set up in a scene, where its viewing a cube. The image shows a purple area
- which indicates the \i{view frustum}, which you can think of for
- now as the area captured by the camera. Actually its more correct to think
- of the volume captured by the camera, and imagine that the purple indication
- in the image is the shadow cast by this volume.
-
- \image view-frustum-angle-shot.png
-
- The odd value for view size comes from the far plane size which was set at
- 8 x 8 when creating the diagram: by similar triangles (8 / 14) x 2.2 = 1.257.
- There is no API call for setting the size of the far-plane, same as in OpenGL.
- So to get this 8 x 8 far plane we had to work out the near plane size.
-
- \image view-frustum-origin.png
-
- This plan view shows the parameters of the camera by reference to a grid.
- You can see that the camera is situated - by QGLCamera::setEye() - to a point
- 8 units back along the negative z axis. The far plane is 14 units away from
- the eye - set by QGLCamera::setFarPlane().
-
- Note that here also the camera is sitting down the negative z axis, looking
- back toward us - the opposite of the default. Its near plane and far plane
- are also much closer. The camera is still pointing to the origin - where a
- 3D cube is situated, ready to be viewed by the camera.
-
- \section1 The View Frustum
-
- The camera can only see a \bold part of the scene - not all of it. Anything
- too far to the camera's right or left is out of the range of its view, and
- even though that part of the scene may contain geometry that is sent to the GPU
- for processing, those triangles will not be visible on the screen. The GPU
- will clip them away - but it still has to do work to do this.
-
- The part of the scene which the camera can see, and which will get displayed
- is called the \bold{View Frustum}. A Frustum is a geometric shape, like a
- pyramid with its top cut off. It has sloping sides due to the perspective
- transformation performed by OpenGL, when simulating the effect of the camera
- in the 3D scene.
-
- The cube in this scene has 6 sides, just like the view frustum, so we can
- compare the names of these:
-
- \table
- \header
- \o Cube
- \o View Frustum
- \row
- \o Front
- \o Near Plane
- \row
- \o Back
- \o Far Plane
- \row
- \o Left side
- \o Left side
- \row
- \o Right side
- \o Right side
- \row
- \o Top
- \o Top
- \row
- \o Bottom
- \o Bottom
- \endtable
-
- Like the cube, the frustum is a solid, and can contain things. You can think of
- it as having a set of bounds. Anything inside these bounds is rendered by OpenGL.
-
- \image view-frustum-10-degrees-angle-shot.png
-
- In this image, we see the camera as a black-line wire-frame. The rectangle of the
- front of the camera represents the \bold{aperture}.
-
- The triangular purple colored area on the floor corresponds to the camera's eye
- and spreads out, as determined by the size of the camera's aperture. If you extended
- the lines from the camera's eye to the four corners of its aperture, those lines would
- define the view frustum. That view frustum would be the same size as the purple
- view triangle, except the part behind the camera aperture is sliced off.
-
- Anything that falls inside the black wire-frame of the camera itself \bold{does not
- get displayed}.
-
- Because the scene needs to be projected onto a camera aperture of a non-zero size,
- this means there is this area between the eye of the camera and its aperture which
- cannot be displayed. Notice that the camera aperture and the Near Plane of the view
- frustum are the same thing.
-
- We can also say that anything which falls outside the fiew frustum \bold{does not get
- displayed} including anything in front of the near plane. Poor camera positioning
- in a scene can often result in this near plane culling which can produce odd visual
- effects as geometry appears and disappears when it passes in front and behind of
- the near plane.
-
- \section1 View Frustum Culling
-
- Carefully examine the next 3 screenshots, which show the same plan view of the
- camera, cube and view - except the cube is rotated arount the eye of the camera
- by 10 degrees each time.
-
- \image view-frustum-10-degrees.png
-
- In this image the cube is slightly out of the view frustum. It still must be sent
- to the GPU, but some of its pixels will be clipped off during rendering.
-
- \image view-frustum-20-degrees.png
-
- In this image the cube is mostly out of the view frustum. It still must be sent
- to the GPU, but most of its pixels will be clipped off during rendering.
-
- \image view-frustum-30-degrees.png
-
- In this image the cube is completey out of the view frustum. Performance could be
- improved by not sending the cubes geometry to the GPU at all. This test must
- be made on the CPU side, so therefore it must be very cheap to do in order to beat
- the cost of just sending it anyway and allowing the GPU to clip away all of it.
-
- The optimisation technique where you detect this case is called \bold{View Frustum
- Culling} and it can a simple and valuable performance enhancement. Qt3D implements
- view frustum culling via the QGLPainter::isCullable() function.
-
- \section1 Aspect-Ratio Correction
-
- The default camera has a viewport which is 2 x 2 in size, as discussed above. However
- when the camera is used to display a scene on a QGLAbstractSurface, for example a
- QGLWidgetSurface, the \bold{aspect ratio} of that surface is taken into account in
- the View Frustum. Specifically code in the QGLCamera::projectionMatrix() function
- takes the aspect ratio and expands the default viewport to match. If the surface is
- wider than it is high, the aspect ratio is greater than 1 and the viewport width is
- multiplied by the aspect ratio to make it larger. If the surface is higher than it
- is wide, the aspect ratio is less than 1 and the viewport height is divided by the
- aspect ratio to make it larger. The result is the viewport aspect ratio matches that
- of the surface it is to be displayed on.
-
- \code
- QGLWidget widget; // creates a 640 x 480 widget by default
- QGLPainter painter(&widget) // internally makes a 640 x 480 QGLWidgetSurface
- qreal asp = painter.currentSurface()->aspectRatio();
- // asp == 1.3333 which is (640 / 480)
- QGLCamera camera; // default camera as above
- painter.setCamera(&camera); // applies the aspect ratio to the perspective projection
- QMatrix4x4 p = painter.projectionMatrix().top();
- QMatrix4x4 q;
- q.frustum(-asp, asp, -1, 1, camera.nearPlane(), camera.farPlane());
- qDebug() << q == p; // prints "true"
- \endcode
-
- One result of this is that clipping to the view frustum can only be done with the
- knowledge of the surface because more of the scene is visible to the left and right
- than would be suggested by the default camera settings.
-*/