この説明との類推により、非標準依存関係なしに言語Cで関数を書きます。
matrixfromnormal <point3>
局所軸z（つまり通常）のベクトルが特定のベクトル<point3>と一致するマトリックスを返します。マトリックスの移動の成分は[0.0.0]です。スケールのコンポーネントの値は、ベクトル<point3>を正規化するために必要な値によって逆です。
関数関数の例（意味）：
MatrixFromNormal（[0.0.1]）が戻ります（Matrix3 [1,0,0]、[0.1,0]、[0.0.1]、[0.0,0,0]））
MatrixFromNormal（[0.1.1]）が戻ります（Matrix3 [0、-0.707107.0.707107] [1.41421.0.0.0.0] [0,1,0,0,0,0]）
#include <math.h>

typedef struct {
  フロートX;
  フロートy;
  フロートZ;
} point3;

typedef struct {
  Point3 x;
  ポイント3 Y;
  Point3 Z;
  Point3翻訳;
} matrix3;

matrix3 matrixfromnomnomal（point3垂直）{
  Matrix3の結果;
  float length = sqrtf（normal.x * normal.x + normor.y * normor.y + normor.z * normal.z）;
  result.z =（point3）{normal.x / leangth、normal.y / leangh、normal.z / leength};
  if（fabsf（result.z.x）<fabsf（result.z.y））{
    float a = 1.0f / sqrtf（result.z.y * result.z.z.y + result.z.z * result.z.z）;
    result.x =（point3）{result.z.z * a、0.0f、-result.z.y * a};
  } それ以外 {
    float a = 1.0f / sqrtf（result.z.x * result.z.z.x + result.z.z * result.z.z）;
    result.x =（point3）{0.0f、result.z.z * a、-result.z.x * a};
  }
  result.y =（point3）{result.z.y * result.x.z -result.z.z * result.x.y、
                     result.z.z * result.x.x -result.z.x * result.x.z、
                     result.z.x * result.x.y -result.z.y * result.x.x};
  result.translation =（point3）{0.0f、0.0f、0.0f};
  返品結果;
}