Вот базовая реализация этой функции на языке С:

#include <math.h>

struct matrix3 {
  float x[3][3];
};

struct point3 {
  float x, y, z;
};

struct matrix3 MatrixFromNormal(struct point3 normal) {
  struct matrix3 result;

  float length = sqrt(normal.x * normal.x + normal.y * normal.y + normal.z * normal.z);
  float invLength = 1.0f / length;

  result.x[0][0] = normal.x * invLength;
  result.x[0][1] = normal.y * invLength;
  result.x[0][2] = normal.z * invLength;

  result.x[1][0] = -normal.y * invLength;
  result.x[1][1] = normal.x * invLength;
  result.x[1][2] = 0;

  result.x[2][0] = -normal.z * invLength;
  result.x[2][1] = 0;
  result.x[2][2] = normal.x * invLength;

  return result;
}



Обратите внимание, что эта реализация предполагает, что входной вектор нормали не равен нулю и не является нулевым вектором. Вам может потребоваться добавить дополнительный код для обработки этих случаев, если они возможны в вашем случае использования.
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence