Что ж, если u - это вектор повышения единицы, а n - нормаль к поверхности единицы, то вам нужно вращение, которое превращает u в п . (Это вращение не уникально: вы можете составить любое вращение примерно за u до него и любое вращение около n после него.)
Как вычислить это вращение? Ну, это зависит от того, с какой структурой или API вы работаете, и как представлены ротации. Достойная структура имеет вызов API для этого, например, в Unity 3D есть Quaternion.FromToRotation
.
Если у вас нет вызова API для этого, тогда вы можете решить это для себя. Любое вращение может быть представлено в виде ось-угол , скажем ( a , θ). Здесь θ - угол между векторами u и n (который можно вычислить, используя правило косинуса : u · n = | u | | n | cos θ), а a - ось, перпендикулярная обоим векторам: a = u × n . (Есть два особых случая: когда u = n будет выполняться нулевое вращение, а если u = - n , любая половина вращение вокруг любого вектора, перпендикулярного к u .)
Если вы используете OpenGL, вы можете позвонить glRotate
.
И если у вас даже этого нет ... ну, вам не нужно задавать этот базовый вопрос! Но см. Википедию , чтобы узнать, как превратить представление оси в угол в матричное представление.