Картирование данных кватерниона телефона с координатами Vulkan и постоянным поведением вращенияC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Картирование данных кватерниона телефона с координатами Vulkan и постоянным поведением вращения

Сообщение Anonymous »

Я работаю над проектом Vulkan, который принимает данные моего телефона кватерниона через UDP -соединение, а затем используется для преобразования координат меча. Тем не менее, модель не точно представляет ориентацию телефона. Я осознаю, что координаты данных телефона отличаются от координат пространства Вулкана, но у меня все еще возникают трудности с их картированием. Мало того, но так как я держу телефон, как меч (экран телефона сталкивается с левой рукой, если вы должны держать его правым), ориентация становится немного сложнее. Так, например, ротации, которые происходят параллельно земле, против параллельной стене, приведут к различным поведению для меча. Я предполагаю, что это происходит потому, что те же повороты все еще применяются к модели, но она вращается не связана с текущим положением меча, что приводит к «неустойчивому» поведению меча. В более простых терминах вращения работают точно так же, как и должны, но в зависимости от ориентации модели меча, ротация, кажется, не точно отражает вращение, возникающее в реальности. Мне было интересно, есть ли хорошее существующее решение для этого?

Код: Выделить всё

void updateUniformBuffer(uint32_t currentImage) {
static auto startTime = std::chrono::high_resolution_clock::now();

auto currentTime = std::chrono::high_resolution_clock::now();
float time = std::chrono::duration(currentTime - startTime).count();

glm::quat mockOriginData(1,0,0,0);

// Quaternion data
motionPacket packetData = *getRecentQuaternionData();
glm::quat q(packetData.orientData.qw, packetData.orientData.qy, packetData.orientData.qx, packetData.orientData.qz); //yxz ~kind of working. -> nvm.
glm::normalize(q);
UniformBufferObject ubo{};
// -> Take the existing quaternion and transform it to match sword standards
ubo.model = glm::mat4_cast(glm::inverse(mockOriginData) * q);

// View transofrmation to look at the geometry from 45 deg. above
// -> params: eye position, center position, and up axis (2,2,2 makes equilateral triangle so deg. is 45)
ubo.view = glm::lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f));

// Projection transformation with 45 deg. FOV
// -> params: FOV angle, aspect ratio, near and far view planes
ubo.proj = glm::perspective(glm::radians(45.0f), swapChainExtent.width / (float)swapChainExtent.height, 0.1f, 10.0f);

// Invert Y coordinate as GLm was designed for OpenGL.
ubo.proj[1][1] *= -1;

// Now copy data from uniform buffer object to the uniform buffer; better to use push constants tho :(
memcpy(uniformBuffersMapped[currentImage], &ubo, sizeof(ubo));
}
Первоначально я думал, что это проблема сопоставления координат, поэтому я попробовал все 6 комбинаций xyz -> (, , _), чтобы определить, было ли это проблемой. Это решило некоторые вещи (поскольку вулканские координаты отличаются от координат кватерниона). Тем не менее, только после того, как я медленно сделал вращения на своем телефоне, я понял, что мне нужно какое -то «земля», чтобы сохранить постоянное вращение.
Но я не знаю, как это сделать: (

Подробнее здесь: https://stackoverflow.com/questions/796 ... ent-rotati
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»