Я работаю над проектом 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 -> (, , _), чтобы определить, было ли это проблемой. Это решило некоторые вещи (поскольку вулканские координаты отличаются от координат кватерниона). Тем не менее, только после того, как я медленно сделал вращения на своем телефоне, я понял, что мне нужно какое -то «земля», чтобы сохранить постоянное вращение.
Но я не знаю, как это сделать: (
Я работаю над проектом Vulkan, который принимает данные моего телефона кватерниона через UDP -соединение, а затем используется для преобразования координат меча. Тем не менее, модель не точно представляет ориентацию телефона. Я осознаю, что координаты данных телефона отличаются от координат пространства Вулкана, но у меня все еще возникают трудности с их картированием. Мало того, но так как я держу телефон, как меч (экран телефона сталкивается с левой рукой, если вы должны держать его правым), ориентация становится немного сложнее. Так, например, ротации, которые происходят параллельно земле, против параллельной стене, приведут к различным поведению для меча. Я предполагаю, что это происходит потому, что те же повороты все еще применяются к модели, но она вращается не связана с текущим положением меча, что приводит к «неустойчивому» поведению меча. В более простых терминах вращения работают точно так же, как и должны, но в зависимости от ориентации модели меча, ротация, кажется, не точно отражает вращение, возникающее в реальности. Мне было интересно, есть ли хорошее существующее решение для этого?[code]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)); } [/code] Первоначально я думал, что это проблема сопоставления координат, поэтому я попробовал все 6 комбинаций xyz -> (, , _), чтобы определить, было ли это проблемой. Это решило некоторые вещи (поскольку вулканские координаты отличаются от координат кватерниона). Тем не менее, только после того, как я медленно сделал вращения на своем телефоне, я понял, что мне нужно какое -то «земля», чтобы сохранить постоянное вращение. Но я не знаю, как это сделать: (
Я хотел бы нарисовать карту с Geopandas , которую я затем хочу наложить со стандартными графиками Matplotlib в качестве подзаскон.
map = gpd.read_file( my_shapefile.shp )
map = np.random.rand(len(map))
fig, ax = plt.subplots(1, 1, figsize=(15,...
Я пытаюсь добиться этого, а также этого, но в Unity3D и с использованием датчика IMU ICM-20948 с 9 степенями свободы:
До сих пор мне удавалось использовать алгоритм Мэджвика и вращайте куб, наклоняя датчик в воздухе. Теперь я не уверен, как...