2015-06-01 3 views
-2

EDITEDБагги CATransform3D?

(пример содержал ошибку, поэтому я заменил его другим)

Следующий код является всего лишь пример того, как это работает:

CATransform3D temp = CATransform3DIdentity; 
temp.m34 = -0.002; 
temp = CATransform3DTranslate(temp, 0, -230, 0); 
temp = CATransform3DRotate(temp, -M_PI/5, 1, 0, 0); 
temp = CATransform3DTranslate(temp, 0, 230, 0); 

Выходной до последнего строка кода:

(lldb) po temp 
(m11 = 1, m12 = 0, m13 = 0, m14 = 0, m21 = 0, m22 = 0.809017002, m23 = -0.587785244, m24 = 0.00117557053, m31 = 0, m32 = 0.587785244, m33 = 0.809017002, m34 = -0.00161803409, m41 = 0, m42 = -230, m43 = 0, m44 = 1) 

Выход после последней строки кода:

(lldb) po temp 
(m11 = 1, m12 = 0, m13 = 0, m14 = 0, m21 = 0, m22 = 0.809017002, m23 = -0.587785244, m24 = 0.00117557053, m31 = 0, m32 = 0.587785244, m33 = 0.809017002, m34 = -0.00161803409, m41 = 0, m42 = -43.9260902, m43 = -135.190613, m44 = 1.27038121) 

Что такое ...? Последняя строка кода ничего не делает, потому что это E (это матрица отступа и умножение с ней должно возвращать тот же результат), но она изменила даже элемент m44, который должен всегда равняться 1.

И даже если это матрица выполняет те же вычисления, что и правильный, например, я не могу просто вернуть значение преобразования, которое хранится в нем.

Может ли кто-нибудь предложить решение, как создавать правильные матрицы (m44 == 1), за исключением того, что они умножают их вручную?

+0

Немного трудно сказать здесь, не могли бы вы показать свой код _real_? – Unheilig

+0

Что вы не можете понять конкретно? 'A' ->' A'', где 'A'' надежно имеет' m44 == 1', используя функции Objective-C? В другом тексте описывается конкретный пример и неожиданный результат. –

+0

Отредактировано: исправлена ​​ошибка. –

ответ

0

Я нашел причину проблемы. Все правильно, потому что в CATransform3D все преобразующие матрицы переставляются, но я подумал, что они выглядят как следующему: enter image description here

Так m44 != 1 потому m34 не z координат или другой вид перевода. Это означает «перспектива», которая влияет на значение m44. Это также запутало меня, что m44 == 1 до последней строки кода.

0

Непонятно, что вы пытаетесь сделать. Вы создаете CATransform3D под названием temp, но в третьей строке вашего кода вы используете переменную с именем transform, которая не упоминается нигде в ваших трех строках кода. Возможно, вы использовали вместо этого temp.

+0

Да, вы правы. Это должно быть 'temp' вместо' transform', и этот пример даже должен работать, поэтому мне нужно опубликовать другой пример. В любом случае у меня есть некоторые случаи, когда 'm44! = 1' –

+0

Я обновил вопрос. Да, он работает с умножениями на матрицу идентичности, но в целом все умножается. –

+0

@ Вячеслав Герчиков нет ничего багги с умножениями вообще или с преобразованиями. Вы используете CATransform3DRotate перед переводом, чтобы получить результат точно так, как ожидалось. Если вы выполните поворот в последний раз, вы увидите, что значение m44 1 сохраняется. – Artal

 Смежные вопросы

  • Нет связанных вопросов^_^