Преобразование вектора из .stl в углы Эйлера

(Я уже проверил этот, но насколько я понял, это не относится к моей проблеме из-за того, что углы плоскостей отличаются от моих.)

Я пишу небольшую часть программного обеспечения на C ++ для небольшого проекта, который я сейчас делаю на этапе обучения в университете.

Я программирую роботизированную руку, чтобы лепить кусок полистирола в форму из 3D-модели. К настоящему времени у меня уже есть «переводчик» на руке, все, что мне нужно сделать, это накормить его позициями в пространстве. Формат должен быть

< x , y , z , e1 , e2 , e3 , > TRUE

С x, y и z в качестве пространственных координат и e1, e2 и e2 в качестве углов Эйлера. (TRUE в конце просто говорит руке, что это не последнее движение).

У меня есть базовый проект (действительно очень простой), который ловит точки из каждого треугольника и переводит его, но у меня нет способа получить углы Эйлера. Формат .stl предоставляет вектор для каждого треугольника, но я просто не могу преобразовать это в 3 угла Эйлера. С помощью acos () я мог получить 3 угла от 3 оси вектора, но после этого мои идеи заканчиваются.

Рука робота перемещается «zyz», поэтому e1 находится вокруг z, e2 вокруг y и e3 снова вокруг z.

Это код, кстати

#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
int defin = 0;
if (argv[1] == 0)
{
argv[1] = "./input.stl";
defin = 1;
}
ifstream infile(/*argv[1]*/"./input.stl");
ofstream outfile("./sculpture.scl");
string inln = "";
string outln = "";
bool stop = 1;
string bnum = "";
string x = "";
string y = "";
string z = "";
string e1 = "0";
string e2 = "0";
string e3 = "0";
int c = 0;

system("pause");
cout << "|| Starting translation...\n";

/*Here comes the stuff to get the name of the thingo. By now I'll just leave a note.*/
getline(infile, inln);
while (stop)
{
getline(infile, inln);
if (inln[2] == 'f')
{
cout << "angles incoming\n";
inln = inln + ';';
/*Here I get the angles. By now I'll just leave a note.*/
}
else if (inln[6] == 'v')
{
cout << "coordinates incoming\n";
inln = inln + ';';
while (inln[c] != 'x')
{
c++;
cout << "reaching x\n";
}
c++;
c++;
while (inln[c] != ' ')
{
bnum = bnum + inln[c];
c++;
cout << "x\n";
}
c++;
x = bnum;
bnum = "";
while (inln[c] != ' ')
{
bnum = bnum + inln[c];
c++;
cout << "y\n";
}
c++;
y = bnum;
bnum = "";
while (inln[c] != ';')
{
bnum = bnum + inln[c];
c++;
cout << "z\n";
}
c++;
z = bnum;
bnum = "";

outln = "<" + x + "," + y + "," + z + ","+ e1 + "," + e2 + "," + e3 + ",>TRUE";
outfile << outln << endl;
c = 0;
}
else if (inln[5] == 'u')
{
cout << "outer loop\n";
/*Nada here*/
}
else if (inln[4] == 'e')
{
cout << "endloop\n";
/*End the Triangle, switch the angles!*/
}
else if (inln[2] == 'e')
{
cout << "endfacet\n";
/*Same as above*/
}
else if (inln[0] == 'e')
{
cout << "Reached the end\n";
stop = 0;
}
else
{
cout << "Dafuq just happened lel\n";
system("pause");
return 1;
}
}
outln = "<0,0,0,0,0,0,>FALSE";
outfile << outln;
system("pause");
}

Спасибо за ваше время. Я действительно очень потерян здесь.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector