Проблема в том, что у меня есть две точки в трехмерном пространстве, где y + вверх, x + справа, а z + - к вам. Я хочу ориентировать цилиндр между ними, который является длиной расстояния между обеими точками, так что оба его центра касаются двух точек. Я получил цилиндр, чтобы перевести его на место в центре двух точек, и мне нужна помощь, которая подходит с матрицей поворота для применения к цилиндру, так что она ориентирована правильно. Моя матрица преобразования для всей вещи выглядит следующим образом:Необходимая матрица вращения для 3D-преобразования opengl
перевод (центральная точка) * rotateX (около X градусов) * rotateZ (некоторые Z градусов)
перевода применяется последним, таким образом я могу получить его до правильной ориентации, прежде чем перевести его.
Вот то, что я до сих пор для этого:
mat4 getTransformation(vec3 point, vec3 parent)
{
float deltaX = point.x - parent.x;
float deltaY = point.y - parent.y;
float deltaZ = point.z - parent.z;
float yRotation = atan2f(deltaZ, deltaX) * (180.0/M_PI);
float xRotation = atan2f(deltaZ, deltaY) * (180.0/M_PI);
float zRotation = atan2f(deltaX, deltaY) * (-180.0/M_PI);
if(point.y < parent.y)
{
zRotation = atan2f(deltaX, deltaY) * (180.0/M_PI);
}
vec3 center = vec3((point.x + parent.x)/2.0, (point.y + parent.y)/2.0, (point.z + parent.z)/2.0);
mat4 translation = Translate(center);
return translation * RotateX(xRotation) * RotateZ(zRotation) * Scale(radius, 1, radius) * Scale(0.1, 0.1, 0.1);
}
Я попробовал решение при вниз, но это не похоже на работу на всех
mat4 getTransformation(vec3 parent, vec3 point)
{
// moves base of cylinder to origin and gives it unit scaling
mat4 scaleFactor = Translate(0, 0.5, 0) * Scale(radius/2.0, 1/2.0, radius/2.0) * cylinderModel;
float length = sqrtf(pow((point.x - parent.x), 2) + pow((point.y - parent.y), 2) + pow((point.z - parent.z), 2));
vec3 direction = normalize(point - parent);
float pitch = acos(direction.y);
float yaw = atan2(direction.z, direction.x);
return Translate(parent) * Scale(length, length, length) * RotateX(pitch) * RotateY(yaw) * scaleFactor;
}
После выполнения кода Я получаю это:
Любая черная точка - это точка с родителем, являющимся точкой, которая породила его (тот, который был перед ним). Я хочу, чтобы ветви соответствовали в точки. В основном я пытаюсь реализовать алгоритм пространственной колонизации для генерации случайного дерева. Я получил большую часть этого, но я хочу сопоставить ветви, чтобы он выглядел хорошо. Я могу использовать GL_LINES только для создания общего соединения, но если я получу эту работу, он будет выглядеть намного красивее. Алгоритм объясняется here.
Вот образ того, что я пытаюсь сделать (простите мои навыки рисования)
Обратите внимание, что отсутствует одна степень свободы: рулон цилиндра вокруг своей оси.Увидев вашу абстрактную формулу, я думаю, вам все равно, какой угол это будет. (Это просто прекрасно, я просто хотел сообщить вам, что есть другие возможности ориентировать цилиндр между двумя точками.) – leemes
Можете ли вы дать мне несколько намеков на другие возможности? Я пытаюсь правильно ориентировать это с 11:00 CMT lol – boddie
Я имею в виду только то, что ваше исходное описание цели оставляет бесконечное количество решений (в математическом смысле, а не как программировать). Идея, которую вы имеете, вероятно, является самым легким решением, потому что она не обладает этой степенью свободы. – leemes