Android openGL ES2rotateMM翻转角度

穆罕默德(Mohamed)

我具有以下相机绘画功能,可以旋转,缩放和平移视图矩阵,但是在某些位置存在一个问题,即角度变化,例如if (event.getAction() == MotionEvent.ACTION_DOWN)偏航为120,俯仰为-40,if (event.getAction() == MotionEvent.ACTION_UP)偏航为165,俯仰为-85不做任何旋转。

    Vector3 nv = Vector3.multiplyScalar(Vector3.normalize(Vector3.cross(cameraUp, cameraRight)), zoom);
    cameraPosition = Vector3.add(cameraPosition, nv);

    Vector3 vY = Vector3.multiplyScalar(cameraUp, -mDeltaY);
    cameraPosition = Vector3.add(cameraPosition, vY);
    Vector3 vZ = Vector3.multiplyScalar(Vector3.normalize(Vector3.cross(cameraDirection, cameraRight)), mDeltaY);
    cameraPosition = Vector3.sub(cameraPosition, vZ);
    Vector3 vX = Vector3.multiplyScalar(Vector3.normalize(Vector3.cross(cameraDirection, cameraUp)), -mDeltaX);
    cameraPosition = Vector3.sub(cameraPosition, vX);
    setLookAtM(viewMatrix, 0, cameraPosition.getX(), cameraPosition.getY(), cameraPosition.getZ(), cameraPosition.getX() + cameraDirection.getX(), cameraPosition.getY() + cameraDirection.getY(),
            cameraPosition.getZ() + cameraDirection.getZ(), 0, 1, 0);
    rotateM(viewMatrix, 0, pitch, 1, 0, 0);
    rotateM(viewMatrix, 0, yaw, 0, 1, 0);

    mDeltaX = 0;
    mDeltaY = 0;
    zoom = 0;

相机设置代码为:

public void initCamera(Vector3 position, Vector3 target) {
    yaw = 0f;
    pitch = 0;
    Vector3 upV = new Vector3(0, 0, 1);
    this.cameraPosition = position;
    this.cameraTarget = target;
    this.cameraDirection = Vector3.normalize(Vector3.sub(target, position));
    this.cameraRight = Vector3.normalize(Vector3.cross(upV, cameraDirection));
    this.cameraUp = Vector3.cross(cameraDirection, cameraRight);
}

这是onTouchEvent代码

if (event.getPointerCount() == 1) {
    float yaw = (x - mPreviousX) / mDensity / 2f;
    float pitch = (y - mPreviousY) / mDensity / 2f;
                    mainRenderer.getCamera().yaw += yaw;
                    mainRenderer.getCamera().pitch += pitch;
}
if (event.getPointerCount() == 2) {
    mCurrDis = getDistance(event);
    if (mLastDis == 0)
        mLastDis = mCurrDis;
    mainRenderer.getCamera().zoom(mLastDis - mCurrDis);
    mLastDis = getDistance(event);
}
if (event.getPointerCount() == 3) {
    float deltaX = (x - mPreviousX) / mDensity / 2f;
    float deltaY = (y - mPreviousY) / mDensity / 2f;
    mainRenderer.getCamera().mDeltaX += deltaX;
    mainRenderer.getCamera().mDeltaY += deltaY;
}
用户8581488

试试这个代码:

void Camera::rotate(GLfloat xoffset, GLfloat yoffset, glm::vec3& c, GLboolean constrainpitch) {
    xoffset *= this->touchSensitivity;
    yoffset *= this->touchSensitivity;
    pitch += yoffset;
    yaw += xoffset;
    if (constrainpitch) {
    if (pitch >= maxPitch) {
        pitch = maxPitch;
        yoffset = 0;
    }
    if (pitch <= minPitch) {
        pitch = minPitch;
        yoffset = 0;
    }
    }
    glm::quat Qx(glm::angleAxis(glm::radians(yoffset), glm::vec3(1.0f, 0.0f, 0.0f)));
    glm::quat Qy(glm::angleAxis(glm::radians(xoffset), glm::vec3(0.0f, 1.0f, 0.0f)));
    glm::mat4 rotX = glm::mat4_cast(Qx);
    glm::mat4 rotY = glm::mat4_cast(Qy);
    view = glm::translate(view, c);
    view = rotX * view;
    view = view * rotY;
    view = glm::translate(view, -c);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android openGL ES2rotateMM翻转角度

来自分类Dev

Android Surfaceflinger和openGL ES

来自分类Dev

Android OpenGL ES无法绘图

来自分类Dev

Android-OpenGL:称为未实现的OpenGL ES API

来自分类Dev

iOS和Android的OpenGL ES差异

来自分类Dev

Android OpenGL ES以宽高比全屏显示图像

来自分类Dev

android opengl-es-2.0-rotationM说明

来自分类Dev

Android何时支持OpenGL ES 3.1?

来自分类Dev

Android OpenGL ES 2.0实时变色

来自分类Dev

Android OpenGL ES 2.0:未显示文本

来自分类Dev

Android opengl-es碰撞检测

来自分类Dev

Android OpenGL Es 3.0创建圈子

来自分类Dev

无法在Android OpenGL ES 2.0中画点

来自分类Dev

iOS和Android的OpenGL ES差异

来自分类Dev

android openGL ES onDrawFrame不重复

来自分类Dev

Android OpenGL ES 2.0:未显示文本

来自分类Dev

android opengl-es-2.0 -rotateM解释

来自分类Dev

Android OpenGL.ES纹理/图像绘图

来自分类Dev

Android OpenGL ES 2.0实时变色

来自分类Dev

Android OpenGL ES以宽高比全屏显示图像

来自分类Dev

Android OpenGl ES三角风扇

来自分类Dev

Android OpenGL-ES-2.0圆或光盘

来自分类Dev

Android OpenGL Es 3.0创建圈子

来自分类Dev

无法在Android OpenGL ES 2.0中画点

来自分类Dev

Android OpenGL ES中的灰度色深

来自分类Dev

Android OpenGL ES茶壶爆炸实现

来自分类Dev

OpenGL ES ANDROID C++ 错误

来自分类Dev

Android:性能问题多纹理 Opengl ES

来自分类Dev

OpenGL ES单像素绘图android