📄 abstractcamera.java
字号:
/*
* Copyright (c) 2003-2009 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme.renderer;
import java.io.IOException;
import java.util.logging.Logger;
import com.jme.bounding.BoundingVolume;
import com.jme.math.FastMath;
import com.jme.math.Matrix4f;
import com.jme.math.Plane;
import com.jme.math.Quaternion;
import com.jme.math.Vector2f;
import com.jme.math.Vector3f;
import com.jme.math.Plane.Side;
import com.jme.util.export.InputCapsule;
import com.jme.util.export.JMEExporter;
import com.jme.util.export.JMEImporter;
import com.jme.util.export.OutputCapsule;
/**
* <code>AbstractCamera</code> implments the <code>Camera</code> interface
* implementing all non-API specific camera calculations. Those requiring API
* (LWJGL, JOGL, etc) specific calls are not implemented making this class
* abstract. API specific classes are expected to extend this class and handle
* renderer viewport setting.
*
* @author Mark Powell
* @author Joshua Slack
*/
public abstract class AbstractCamera implements Camera {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(AbstractCamera.class
.getName());
//planes of the frustum
/**
* LEFT_PLANE represents the left plane of the camera frustum.
*/
public static final int LEFT_PLANE = 0;
/**
* RIGHT_PLANE represents the right plane of the camera frustum.
*/
public static final int RIGHT_PLANE = 1;
/**
* BOTTOM_PLANE represents the bottom plane of the camera frustum.
*/
public static final int BOTTOM_PLANE = 2;
/**
* TOP_PLANE represents the top plane of the camera frustum.
*/
public static final int TOP_PLANE = 3;
/**
* FAR_PLANE represents the far plane of the camera frustum.
*/
public static final int FAR_PLANE = 4;
/**
* NEAR_PLANE represents the near plane of the camera frustum.
*/
public static final int NEAR_PLANE = 5;
/**
* FRUSTUM_PLANES represents the number of planes of the camera frustum.
*/
public static final int FRUSTUM_PLANES = 6;
/**
* MAX_WORLD_PLANES holds the maximum planes allowed by the system.
*/
public static final int MAX_WORLD_PLANES = 32;
//the location and orientation of the camera.
/**
* Camera's location
*/
protected Vector3f location;
/**
* Direction of camera's 'left'
*/
protected Vector3f left;
/**
* Direction of 'up' for camera.
*/
protected Vector3f up;
/**
* Direction the camera is facing.
*/
protected Vector3f direction;
/**
* Distance from camera to near frustum plane.
*/
protected float frustumNear;
/**
* Distance from camera to far frustum plane.
*/
protected float frustumFar;
/**
* Distance from camera to left frustum plane.
*/
protected float frustumLeft;
/**
* Distance from camera to right frustum plane.
*/
protected float frustumRight;
/**
* Distance from camera to top frustum plane.
*/
protected float frustumTop;
/**
* Distance from camera to bottom frustum plane.
*/
protected float frustumBottom;
//Temporary values computed in onFrustumChange that are needed if a
//call is made to onFrameChange.
protected float coeffLeft[];
protected float coeffRight[];
protected float coeffBottom[];
protected float coeffTop[];
/* Frustum planes always processed for culling. Seems to simply always be 6. */
protected int planeQuantity;
//view port coordinates
/**
* Percent value on display where horizontal viewing starts for this camera.
* Default is 0.
*/
protected float viewPortLeft;
/**
* Percent value on display where horizontal viewing ends for this camera.
* Default is 1.
*/
protected float viewPortRight;
/**
* Percent value on display where vertical viewing ends for this camera.
* Default is 1.
*/
protected float viewPortTop;
/**
* Percent value on display where vertical viewing begins for this camera.
* Default is 0.
*/
protected float viewPortBottom;
/**
* Array holding the planes that this camera will check for culling.
*/
protected Plane[] worldPlane;
/**
* Computation vector used in lookAt operations.
*/
protected Vector3f newDirection = new Vector3f();
/**
* A mask value set during contains() that allows fast culling of a Node's
* children.
*/
private int planeState;
protected int width;
protected int height;
/**
* Constructor instantiates a new <code>AbstractCamera</code> object. All
* values of the camera are set to default.
*/
public AbstractCamera() {
this(false);
}
/**
* Constructor instantiates a new <code>AbstractCamera</code> object. All
* values of the camera are set to default.
*/
public AbstractCamera(boolean dataOnly) {
setDataOnly(dataOnly);
location = new Vector3f();
left = new Vector3f( 1, 0, 0 );
up = new Vector3f( 0, 1, 0 );
direction = new Vector3f( 0, 0, 1 );
frustumNear = 1.0f;
frustumFar = 2.0f;
frustumLeft = -0.5f;
frustumRight = 0.5f;
frustumTop = 0.5f;
frustumBottom = -0.5f;
coeffLeft = new float[2];
coeffRight = new float[2];
coeffBottom = new float[2];
coeffTop = new float[2];
viewPortLeft = 0.0f;
viewPortRight = 1.0f;
viewPortTop = 1.0f;
viewPortBottom = 0.0f;
planeQuantity = 6;
worldPlane = new Plane[MAX_WORLD_PLANES];
for ( int i = 0; i < MAX_WORLD_PLANES; i++ ) {
worldPlane[i] = new Plane();
}
//call the API specific rendering
//FIX ME: this calls methods of subclasses before the constructors of the subclasses have been called!!!
onFrustumChange();
onViewPortChange();
onFrameChange();
logger.info("Camera created.");
}
/**
* <code>getFrustumBottom</code> returns the value of the bottom frustum
* plane.
*
* @return the value of the bottom frustum plane.
*/
public float getFrustumBottom() {
return frustumBottom;
}
/**
* <code>setFrustumBottom</code> sets the value of the bottom frustum
* plane.
*
* @param frustumBottom the value of the bottom frustum plane.
*/
public void setFrustumBottom( float frustumBottom ) {
this.frustumBottom = frustumBottom;
onFrustumChange();
}
/**
* <code>getFrustumFar</code> gets the value of the far frustum plane.
*
* @return the value of the far frustum plane.
*/
public float getFrustumFar() {
return frustumFar;
}
/**
* <code>setFrustumFar</code> sets the value of the far frustum plane.
*
* @param frustumFar the value of the far frustum plane.
*/
public void setFrustumFar( float frustumFar ) {
this.frustumFar = frustumFar;
onFrustumChange();
}
/**
* <code>getFrustumLeft</code> gets the value of the left frustum plane.
*
* @return the value of the left frustum plane.
*/
public float getFrustumLeft() {
return frustumLeft;
}
/**
* <code>setFrustumLeft</code> sets the value of the left frustum plane.
*
* @param frustumLeft the value of the left frustum plane.
*/
public void setFrustumLeft( float frustumLeft ) {
this.frustumLeft = frustumLeft;
onFrustumChange();
}
/**
* <code>getFrustumNear</code> gets the value of the near frustum plane.
*
* @return the value of the near frustum plane.
*/
public float getFrustumNear() {
return frustumNear;
}
/**
* <code>setFrustumNear</code> sets the value of the near frustum plane.
*
* @param frustumNear the value of the near frustum plane.
*/
public void setFrustumNear( float frustumNear ) {
this.frustumNear = frustumNear;
onFrustumChange();
}
/**
* <code>getFrustumRight</code> gets the value of the right frustum plane.
*
* @return frustumRight the value of the right frustum plane.
*/
public float getFrustumRight() {
return frustumRight;
}
/**
* <code>setFrustumRight</code> sets the value of the right frustum plane.
*
* @param frustumRight the value of the right frustum plane.
*/
public void setFrustumRight( float frustumRight ) {
this.frustumRight = frustumRight;
onFrustumChange();
}
/**
* <code>getFrustumTop</code> gets the value of the top frustum plane.
*
* @return the value of the top frustum plane.
*/
public float getFrustumTop() {
return frustumTop;
}
/**
* <code>setFrustumTop</code> sets the value of the top frustum plane.
*
* @param frustumTop the value of the top frustum plane.
*/
public void setFrustumTop( float frustumTop ) {
this.frustumTop = frustumTop;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -