Opengl Просмотр матрицы на основе входных данных - PullRequest
0 голосов
/ 30 апреля 2020

Я получил положение камеры, точку прицеливания камеры и вектор вверх через пользовательский ввод. Пользователь вводит 3 двойных для каждого для xy z. И теперь я пытаюсь найти вектор z и вектор y, который затем можно нормализовать. Я просто пытаюсь выяснить, как найти эти значения, и я не до конца уверен, что пользовательский ввод на самом деле означает с точки зрения координат. У меня каждый вход хранится как Vector3d

1 Ответ

0 голосов
/ 01 мая 2020

Мне также нужно было найти решение этой проблемы, и в итоге я использовал библиотеку javascript с именем gl-matrix, которая поставляется с вспомогательной функцией targetTo.

Вот исходный код: http://glmatrix.net/docs/mat4.js.html#line1708

И вот моя попытка преобразовать его в C.
Отказ от ответственности: я не компилировал это, поэтому, если вы обнаружите синтаксические ошибки, пожалуйста, укажите их в комментарии.

#include <math.h>

float *targetTo(float *out, float *eye, float *target, float *up) {

  float eyex = eye[0],

    eyey = eye[1],

    eyez = eye[2],

    upx = up[0],

    upy = up[1],

    upz = up[2];

  float z0 = eyex - target[0],

    z1 = eyey - target[1],

    z2 = eyez - target[2];

  float len = z0 * z0 + z1 * z1 + z2 * z2;

  if (len > 0) {

    len = 1 / sqrt(len);

    z0 *= len;

    z1 *= len;

    z2 *= len;

  }

  float x0 = upy * z2 - upz * z1,

    x1 = upz * z0 - upx * z2,

    x2 = upx * z1 - upy * z0;

  float = x0 * x0 + x1 * x1 + x2 * x2;

  if (len > 0) {

    len = 1 / sqrt(len);

    x0 *= len;

    x1 *= len;

    x2 *= len;

  }

  out[0] = x0;

  out[1] = x1;

  out[2] = x2;

  out[3] = 0;

  out[4] = z1 * x2 - z2 * x1;

  out[5] = z2 * x0 - z0 * x2;

  out[6] = z0 * x1 - z1 * x0;

  out[7] = 0;

  out[8] = z0;

  out[9] = z1;

  out[10] = z2;

  out[11] = 0;

  out[12] = eyex;

  out[13] = eyey;

  out[14] = eyez;

  out[15] = 1;

  return out;

}

Примечание: вы можете использовать double вместо float
или если вы работаете с std::vector<int>, который также может быть использован в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...