【问题标题】:rotationMatrix in landscape mode changing? Augmented reallity on iPhone横向模式下的旋转矩阵改变? iPhone 上的增强现实
【发布时间】:2013-03-17 11:47:12
【问题描述】:

我正在构建 au 增强现实应用程序,该应用程序显示某些兴趣点所指定地点的建筑物。当您使用 iPhone(在纵向模式下)指向该点时,OpenGL 3D 模型会出现在由纬度和经度指示的位置(它使用 CMDeviceMotion 中的 rotationMatrix 将 GPS 坐标转换为屏幕坐标并获取值x 和 y)。

我的问题是我也希望它在横向模式下工作。我已经完成了旋转视图的所有工作,根据当前设备方向调整标题......但是当您以横向模式指向建筑物时,模型并未固定到该坐标,而是在屏幕上移动。我认为问题是当你改变设备的方向时,rotationMatrix 必须改变,但我找不到解决这个问题的方法。有什么帮助吗?

- (void)onDisplayLink:(id)sender {
    //Obtenemos los datos de movimiento del dispositivo
    CMDeviceMotion *d = motionManager.deviceMotion;

    //Si no son nulos (la localizacion esta activada y el magnetometro calibrado)
    if (d != nil) {
        //Obtenemos la matriz de rotacion
        CMRotationMatrix r = d.attitude.rotationMatrix;
        transformFromCMRotationMatrix(cameraTransform, &r);

        //Indicamos a la vista que necesita ser renderizada de nuevo
        [self setNeedsDisplay];
    }
}


- (void)drawRect:(CGRect)rect {

    //vistaGPS.transform = CGAffineTransformMakeRotation([gestorOrientacion >devolverAnguloSegunOrientacion]);

    //Si aun no tenemos puntos de interes, salimos
    if (placesOfInterestCoordinates == nil) {
        return;
    }

    //Multiplica la matriz de proyeccion y la de rotacion ¿¿¿para obtener la rotacion en >coordenadas openGL
    mat4f_t projectionCameraTransform;
    multiplyMatrixAndMatrix(projectionCameraTransform, projectionTransform, >cameraTransform);

    //Inicializamos el contador
    int i = 0;

    CLHeading *heading = locationManager.heading;
    CLLocationDirection gradosDiferenciaNorteSinCorregir = heading.trueHeading;

    //NSLog(@"%f , %f", gradosDiferenciaNorteSinCorregir, >gradosDiferenciaNorteSinCorregir+90);
    CLLocationDirection gradosDiferenciaNorte = [gestorOrientacion >devolverHeadingCorregidoSegunOrientacion:gradosDiferenciaNorteSinCorregir];
    ////float bearing = [self getHeadingForDirectionFromCoordinate:newLocation.coordinate >toCoordinate: poi.coordenadas.coordinate];

    labelHeading.text = [NSString stringWithFormat:@"Heading: %f", gradosDiferenciaNorte];        


    NSArray *subvistas = [self subviews];

    for (PuntoInteres *poi in [puntosDeInteres objectEnumerator]) {
        if ([subvistas containsObject:poi.vistaGL]) {
            vec4f_t v;

            //Multiplicamos la matriz por el vector de coordenadas del punto de interes
            multiplyMatrixAndVector(v, projectionCameraTransform, >placesOfInterestCoordinates[i]);

            float x = (v[0] / v[3] + 1.0f) * 0.5f;
            float y = (v[1] / v[3] + 1.0f) * 0.5f;

            [vistaGPS cambiarTextoLabelLatitud:x LabelLongitud:y LabelPrecision:88];


            //Si la coordenada Z del vector es negativa, el modelo debe verse
            if (v[2] < 0.0f) {
                //Centramos la vista en el punto adecuado
                poi.vistaGL.center = CGPointMake(x*self.bounds.size.width, >self.bounds.size.height-y*self.bounds.size.height);

                //Indicamos que deje de estar oculta
                poi.vistaGL.hidden = NO;

                [poi.vistaGL.modeloAPintar establecerRotacionEnX:0.0 Y:gradosDiferenciaNorte >Z:0.0];

                //Le decimos que comience a dibujarse
                [poi.vistaGL startAnimation];
            } else {
                //Indicamos que este oculta
                poi.vistaGL.hidden = YES;

                //Le decimos que deje de dibujarse
                [poi.vistaGL stopAnimation];
            }
        }
        i++;
    }
}


void transformFromCMRotationMatrix(vec4f_t mout, const CMRotationMatrix *m) {
    mout[0] = (float)m->m11;
    mout[1] = (float)m->m21;
    mout[2] = (float)m->m31;
    mout[3] = 0.0f;

    mout[4] = (float)m->m12;
    mout[5] = (float)m->m22;
    mout[6] = (float)m->m32;
    mout[7] = 0.0f;

    mout[8] = (float)m->m13;
    mout[9] = (float)m->m23;
    mout[10] = (float)m->m33;
    mout[11] = 0.0f;

    mout[12] = 0.0f;
    mout[13] = 0.0f;
    mout[14] = 0.0f;
    mout[15] = 1.0f;
}

【问题讨论】:

    标签: augmented-reality


    【解决方案1】:

    这是我的答案On stackoverflow的副本

    当屏幕方向改变时,旋转矩阵不会绕 Z 轴旋转。角度属性确实可以解决这个问题,但我宁愿只使用旋转矩阵。这是我的代码:

    GLKMatrix4 deviceMotionAttitudeMatrix;
    if (_cmMotionmanager.deviceMotionActive) {
        CMDeviceMotion *deviceMotion = _cmMotionmanager.deviceMotion;
    
        // Correct for the rotation matrix not including the screen orientation:
        // TODO: Let the device notify me when the orientation changes instead of querying on each update.
        UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
        float deviceOrientationRadians = 0.0f;
        if (orientation == UIDeviceOrientationLandscapeLeft) {
            deviceOrientationRadians = M_PI_2;
        }
        if (orientation == UIDeviceOrientationLandscapeRight) {
            deviceOrientationRadians = -M_PI_2;
        }
        if (orientation == UIDeviceOrientationPortraitUpsideDown) {
            deviceOrientationRadians = M_PI;
        }
        GLKMatrix4 baseRotation = GLKMatrix4MakeRotation(deviceOrientationRadians, 0.0f, 0.0f, 1.0f);
    
        CMRotationMatrix a = deviceMotion.attitude.rotationMatrix;
        deviceMotionAttitudeMatrix
            = GLKMatrix4Make(a.m11, a.m21, a.m31, 0.0f,
                             a.m12, a.m22, a.m32, 0.0f,
                             a.m13, a.m23, a.m33, 0.0f,
                             0.0f, 0.0f, 0.0f, 1.0f);
        deviceMotionAttitudeMatrix = GLKMatrix4Multiply(baseRotation, deviceMotionAttitudeMatrix);
    }
    else
    {
        // Look straight forward (we're probably in the simulator, or a device without a gyro)
        deviceMotionAttitudeMatrix = GLKMatrix4MakeRotation(-M_PI_2, 1.0f, 0.0f, 0.0f);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多