void MultMarix(int ARows, int BCols, int ACols, float* A, float* B, float* C) {
for (int i = 0; i < ARows; ++i) {
float* c = C + i * BCols;
for (int j = 0; j < BCols; ++j)
c[j] = 0;
for (int k = 0; k < ACols; ++k) {
float* b = B + k * BCols;
float a = A[i * ACols + k];
for (int j = 0; j < BCols; ++j)
c[j] += a * b[j];
}
}
}
Point3D* CreateCentralMatrix(float r) {
Point3D P[4] = {
{1,0,0,0},
{0,1,0,0},
{0,0,0,r},
{0,0,0,1} };
Point3D* M = (Point3D*)calloc(4, sizeof(Point3D));
memcpy(M, P, sizeof(Point3D) * 4);
return M;
}
void ApplyTransform(Point3D* model, int cnt, Point3D* Matrix, Point3D* destModel) {
Point3D* transformed = (Point3D*)calloc(cnt, sizeof(Point3D));
MultMarix(cnt, 4, 4, (float*)model, (float*)Matrix, (float*)transformed);
for (int i = 0; i < cnt; i++)
{
float dt = 1.0f - transformed[i].q;
transformed[i].x += dt;
transformed[i].y += dt;
transformed[i].z += dt;
transformed[i].q += dt;
}
memcpy(destModel, transformed, sizeof(Point3D) * cnt);
delete transformed;
}
Point3D offset = GetCenter(Quad, 8);
ApplyTransform(rendermodel, 8, CreateTranslateMatrix(-offset.x, -offset.y, -offset.z), rendermodel);
ApplyTransform(rendermodel, 8, CreateScaleMatrix(scale, scale, scale), rendermodel);
ApplyTransform(rendermodel, 8, CreateCentralMatrix(-0.5), rendermodel);
RenderQuad2D(hdc, rendermodel, 8);
delete rendermodel;
Все остальные то матрицы работаю. И смещение и масштаб и поворот. Так что врядли там умножение косячит. Сам сдвиг к точке 100,100 делаю уже при рендеринге. Тупо прибавляю координаты нового центра. Так что это не должно влиять.