سؤال

أنا باستخدام CMDeviceMotion والموقف هو من أربعة إلى الحصول على الملعب و ياو القيم التي يتم تطبيقها على CC3Camera في Cocos3D المشهد إلى تدوير الكاميرا حول.

#define RadiansToDegrees(x) ((180 / M_PI) * x)

- (void)initializeScene
{
    //...

    CC3Camera *cam = [CC3Camera nodeWithName:@"Camera"];
    cam.location = cc3v(0, 10, 0.0001);
    cam.targetLocation = cc3v(0, 0, 0);
    _cameraBoom = [CC3Node nodeWithName:@"CameraBoom"];
    _cameraBoom.location = cc3v(0, 0, 0);
    [_cameraBoom addChild:cam];
    [self addChild:_cameraBoom];
    [self setActiveCamera:cam];
    _cameraBoom.rotation = cc3v(0, 90, 0);

    //...

    _motionManager = [[CMMotionManager alloc] init];
    _referenceAttitude = nil;
    _initialCameraRotation = _cameraBoom.rotation;

    [self enableMotion];
}

- (void)enableMotion
{
    CMDeviceMotion *deviceMotion = _motionManager.deviceMotion;
    _referenceAttitude = deviceMotion.attitude;
    _initialCameraRotation = _cameraBoom.rotation;

    [_motionManager startDeviceMotionUpdates];

    if (!_gyroTimer) {
        _gyroTimer = [NSTimer scheduledTimerWithTimeInterval:1 / 30.0
                                                      target:self
                                                    selector:@selector(doGyroUpdate)
                                                    userInfo:nil
                                                     repeats:YES];
    }
}

- (void)doGyroUpdate
{
    CMDeviceMotion *deviceMotion = _motionManager.deviceMotion;
    CMAttitude *attitude = deviceMotion.attitude;

    if (_referenceAttitude != nil) {
        [attitude multiplyByInverseOfAttitude:_referenceAttitude];
    }

    CMQuaternion quat = attitude.quaternion;
    double pitch = RadiansToDegrees(atan2(2 * (quat.x * quat.w + quat.y * quat.z), 1 - 2 * (quat.x * quat.x + quat.z * quat.z)));
    double yaw = RadiansToDegrees(asin(2 * (quat.x * quat.y + quat.w * quat.z)));

    _cameraBoom.rotation = CC3VectorAdd(_initialCameraRotation, cc3v(pitch, yaw, 0));
}

الملعب هو في مجموعة [-π ، π].عندما يكون الجهاز في مواجهة الملعب = 0 و يصبح π/2 كما أخذت الجهاز من الجدول النقطة أن تأخذ صورة (وضع عمودي).عن [-π ، π] مجموعة يتيح لي أن تدوير الجهاز 360 درجة.عندما تواجه أسفل (أيالجهاز رأسا على عقب) الملعب القيمة π.

ياو مجموعة فقط [-π/2 ، π/2].فإنه يبدأ عند 0 و يذهب إلى π/2 عندما تدوير الجهاز إلى اليسار.ولكن إذا كنت تناوب عليها خارج π/2 ياو قيمة يبدأ في الانخفاض.

هل يمكنني الحصول على ياو قيمة في مجموعة [-π ، π] مثل الملعب ؟ وسيكون من المفيد أن تكون قادرة على تدوير الكاميرا جانبية 180 درجة (إلى اليسار وإلى اليمين ، أن يكون كامل 360 درجة) بدلا من التقليب الجهاز عموديا للبحث وراء الكاميرا.

هل كانت مفيدة؟

المحلول

وهنا كيف أنا فعلت هذا في نهاية المطاف مع المدمج في وظائف:

- (void)doGyroUpdate
{
    CMDeviceMotion *deviceMotion = _motionManager.deviceMotion;
    CMAttitude *attitude = deviceMotion.attitude;

    if (_referenceAttitude != nil) {
        [attitude multiplyByInverseOfAttitude:_referenceAttitude];
    }

    CMQuaternion quat = attitude.quaternion;
    CC3Quaternion cc3Quat = CC3QuaternionMake(quat.x, quat.y, quat.z, quat.w);
    CC3Vector rot = CC3RotationFromQuaternion(cc3Quat);

    _cameraBoom.rotation = cc3v(-rot.x, -rot.z, rot.y);
}

النتيجة:

تناوب الكاميرا مثل ذلك يتيح لك أن ننظر حولنا في المقصورة العليا كما لو كنت عادة ما ننظر إلى العالم من خلال الجهاز هو الكاميرا الخلفية.بلدي CC3Camera الكائن داخل المجال مع HDRi الصورة المعينة على ذلك ، في الداخل (انظر هذا ما بعد).

إلى بسلاسة تدوير الكاميرا:

[_cameraBoom runAction:[CC3ActionRotateTo actionWithDuration:0.15 rotateTo:cc3v(-rot.x, -rot.z, rot.y)]];

آمل أن يساعد هذا شخص آخر أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top