Переменная может использоваться с обеих сторон умножения, поэтому вы должны быть особенно осторожны в отношении соглашения, которое вы используете.
ентация Apple по «Работе с матрицами» не только использует противоречие между основными столбцами и основными строками, но и усугубляет путаницу, приводя примеры «построения» матрицы преобразования и «матрицы вращения» в 2D.
Перевести матрицу в документацию Apple ()
Перевод Матрица перевода принимает следующую форму:
1 0 0
0 1 0
tx ty 1
Библиотека simd предоставляет константы для единичных матриц (матриц с единицами по диагонали и нулями в других местах). Тождественная матрица с плавающей запятой 3 x 3 - matrix_identity_float3x3.
Следующая функция возвращает матрицу simd_float3x3, используя указанные значения преобразования tx и ty, устанавливая элементы в единичной матрице:
func makeTranslationMatrix(tx: Float, ty: Float) -> simd_float3x3 {
var matrix = matrix_identity_float3x3
matrix[0, 2] = tx
matrix[1, 2] = ty
return matrix
}
Моя проблема с этим
Строка кодаmatrix[0, 2] = tx
устанавливает значение первого столбца и третьей строкиtx
. let translationMatrix = makeTranslationMatrix(tx: 1, ty: 3)
и распечатывать 2-й столбецprint(translationMatrix.columns.2)
будет даватьfloat3(0.0, 0.0, 1.0)
, Меня очень смущает вопрос, почему именно последняя строка содержит значения перевода, а не столбец. Это соглашение не используется при использованииSCNMatrix4MakeTranslation
и созданиеsimd_float4x4
внеSCNMatrix4
объект.
var A = SCNMatrix4MakeTranslation(1,2,3)
var Asimd = simd_float4x4(A)
A.m41 // 1
A.m42 // 2
A.m43 // 3
A.m44 // 1
Asimd.columns.3 // float4(1.0, 2.0, 3.0, 1.0)
ОбеSCNMatrix4
а такжеsimd_float4x4
следоватьосновной столбец соглашение об именовании. В 2D-примере от Apple, это последняя строка, которая содержит значения перевода, тогда как сSCNMatrix4
и преобразование вsimd_float4x4
, это последний столбец, который содержит значения перевода. Пример Apple, похоже, делает то же самое с матрицами вращения.
Чего мне не хватает?