Как применить фильтр к CMRotationMatrix с помощью CADisplayLinkIOS

Программируем под IOS
Ответить
Anonymous
 Как применить фильтр к CMRotationMatrix с помощью CADisplayLink

Сообщение Anonymous »

Как применить фильтр к CMRotationMatrix? возможно фильтр Калмана. Мне нужно исправить шум CMRotationMatrix (transformFromCMRotationMatrix), чтобы получить линейные значения результирующей матрицы.

Значения этой матрицы будут преобразованы в XYZ, в моем случае я моделирую 3D на 2D-экране вот так:

// Приведение матрицы к x, y

vec4f_t v;
multiplyMatrixAndVector(v, projectionCameraTransform, boxMatrix);

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

CGPointMake(x * self.bounds.size.width, self.bounds.size.height - (y * self.bounds.size.height));


код:

// определение переменной

mat4f_t cameraTransform;


// запускаем цикл отображения ссылок

- (void)startDisplayLink
{
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(onDisplayLink:)];
[displayLink setFrameInterval:1];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}


// останавливаем цикл отображения ссылок

- (void)stopDisplayLink
{
[displayLink invalidate];
displayLink = nil;
}


// событие отображения ссылки

- (void)onDisplayLink:(id)sender
{
CMDeviceMotion *d = motionManager.deviceMotion;

if (d != nil) {
CMRotationMatrix r = d.attitude.rotationMatrix;

transformFromCMRotationMatrix(cameraTransform, &r);
[self setNeedsDisplay];
}
}


/ функция срабатывает перед [self setNeedDisplay];

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;
}


// Процедуры матрично-векторного и матрично-матричного умножения

void multiplyMatrixAndVector(vec4f_t vout, const mat4f_t m, const vec4f_t v)
{
vout[0] = m[0]*v[0] + m[4]*v[1] + m[8]*v[2] + m[12]*v[3];
vout[1] = m[1]*v[0] + m[5]*v[1] + m[9]*v[2] + m[13]*v[3];
vout[2] = m[2]*v[0] + m[6]*v[1] + m[10]*v[2] + m[14]*v[3];
vout[3] = m[3]*v[0] + m[7]*v[1] + m[11]*v[2] + m[15]*v[3];
}


Подробнее здесь: https://stackoverflow.com/questions/114 ... isplaylink
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»