cesium 设置和移动camera相机(工具篇)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cesium 设置和移动camera相机(工具篇)相关的知识,希望对你有一定的参考价值。
参考技术A 1,相机的移动 使用move方法可以朝一个方向移动特定的距离,单位为米。相机移动时位置会发生变化,相机的朝向不变移动方法:Camera.prototype.move = function (direction, amount)
相机向前移动:moveForward(amount) amount步长:米
相机向后移动:moveBackward(amount) amount步长:米
相机向上移动:moveUp(amount) amount步长:米
相机向下移动:moveDown(amount) amount步长:米
相机向左移动:moveLeft(amount) amount步长:米
相机向右移动:moveRight(amount) amount步长:米
2,相机在固定位置的旋转
方法:Camera.prototype.look = function (axis, angle) 实现原理是给定一个旋转轴和角度,用于四元数计算,然后根据四元数求得旋转矩阵,再根据旋转矩阵更新direction,up,right方向
相机向左看:.lookLeft(amount) amount弧度
相机向右看:.lookRight(amount) amount弧度
相机向上看:.lookUp(amount) amount弧度
相机向下看:.lookDown(amount) amount弧度
朝前方向逆时针旋转相机:.twistLeft(amount) amount弧度
朝前方向顺时针旋转相机:.twisRight(amount) amount弧度
使用camera.unproject重新渲染纹理会在相机移动时设置错误的位置
问题
当我移动相机时,每个正在渲染的纹理在两个不同的位置上闪烁。
我想要的是
示例:当我将相机向左移动时,我希望所有纹理向右移动32个像素。按下每个按钮移动32个像素。
目前的代码
我在评论中添加了一些额外的解释。
MainProgramEntryPoint
/**
* DefaultCamera: Setting up OrthographicCamera
* CameraMovement: Using camera.translate on keypresses to move the screen.
* TestMoveable: Creating a texture for testing rendering.
*/
public class WorldSimGame extends ApplicationAdapter {
private DefaultCamera defaultCamera;
private CameraMovement cameraMovement;
private TestMoveable testMoveable;
// Setting up the camera and texture.
public void create () {
defaultCamera = new DefaultCamera();
cameraMovement = new CameraMovement(defaultCamera.getCamera());
testMoveable = new TestMoveable();
testMoveable.create(defaultCamera);
}
// The testMoveable.render(defaultCamera) should keep track of the testMoveable position
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
defaultCamera.render();
testMoveable.render(defaultCamera);
}
}
TestMoveable
public class TestMoveable {
private Texture tex;
private SpriteBatch batch;
private Vector3 position;
public void create(DefaultCamera defaultCamera) {
tex = new Texture(("wall.png"));
batch = new SpriteBatch();
position = new Vector3(100, 100, 0);
defaultCamera.getCamera().unproject(position);
}
我无法想象在世界坐标上设置x和y坐标是行不通的。
public void render(DefaultCamera defaultCamera) {
batch.begin();
batch.draw(tex, position.x, position.y);
batch.end();
}
}
我在这做错了什么?是否有更好的方法来实现渲染器的位置检查?
答案
您无需检查渲染器的位置。所有你必须做的是设置你的camera
的大小和位置。然后用batch.setProjectionMatrix(camera.combined)
你说批次画出相机看到的东西。
因此,当您创建尺寸= 50x50且位置= 100,100的相机时
现在你创建一个大小= 50x50且位置= 75,75的Texture
纹理将完美贴合孔屏幕。
相机的位置在中心。所以Texture
的位置是75,75而不是100,100
当您现在移动相机时,可以使用相机的translate()
方法。
打电话:camera.translate(25,0)
将你的相机向右移动25个单位,现在你只能在屏幕左侧看到你的Texture
的一半。
这是可移动相机的简单示例。您可以使用箭头键移动:
public class WorldSimGame extends ApplicationAdapter {
private OrthographicCamera camera;
private SpriteBatch batch;
private Texture texture;
public WorldSimGame() { }
@Override
public void create(){
//Create texture, batch and camera
texture = new Texture(Gdx.files.internal("badlogic.jpg"));
batch = new SpriteBatch();
camera = new OrthographicCamera(60,60);
}
@Override
public void render(){
//clear screen
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
moveCamera();
//update camera that he recalculate his position and Matrix
camera.update();
batch.setProjectionMatrix(camera.combined); //set batch to draw what the camera sees
batch.begin();
batch.draw(texture,0,0); //draw texture
batch.end();
}
private void moveCamera(){
//move camera
if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)){
camera.translate(4,0);
}
if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
camera.translate(-4,0);
}
if(Gdx.input.isKeyPressed(Input.Keys.UP)){
camera.translate(0,4);
}
if(Gdx.input.isKeyPressed(Input.Keys.DOWN)){
camera.translate(0,-4);
}
}
}
以上是关于cesium 设置和移动camera相机(工具篇)的主要内容,如果未能解决你的问题,请参考以下文章
Cesium入门12 - Camera Modes - 相机模式