У меня есть личный проект в C ++. < /p>
Я являюсь новичком C ++, поэтому, хотя я много изучал это, стало очевидно, что единственный способ заставить его работать-с глубокими знаниями и опытом, которых у меня нет. Сферы разделяют одну текстуру, которая расширяется на обеих сферах. На «шве», который является статичным в пространстве, текстура меняет поверхности сфер. По сути, это как будто две сферы имеют одну поверхность, и они связаны вместе на «швах», которые являются статичными в пространстве. Это было довольно просто сделать само по себе: < /p>
1. 3D-сфера с текстурой карты на ее поверхности вращается вдоль трех оси на разных фазах < /p>
Второй GIF-это демонстрация поведения с заменой текстуры, к которому я стремлюсь, продемонстрировал на обеих сферах, но используя только одну ось вращения. Это немного чит, так как на этом изображении геометрия сфер на самом деле не вращаются. «Спин» достигается путем прокрутки текстуры на поверхностях сфер, после того, как разрезал текстуру пополам и положив половину на поверхности каждой сферы: < /p>
2. Две 3D -сферы с прокруткой текстуры карты, прокручивая их поверхности и перемещаются от одной сферы к другой на красных швах '< /p>
, но проблема в том, что я не могу получить поведение во втором цифру, если я вращаю сферы «геометрия (потому что тогда он вращается в« Швоте », и я хочу, чтобы я был в« Поведенном поведении », и я не могу быть в поведении. Вращение, перемещая изображение вокруг текстуры (потому что тогда я получаю странные искажения, когда изображение движется к полюсам, и «вращение» не точнее для того, как бы она была бы, если на самом деле вращалась). во втором гифке. Красные шкуры должны оставаться статичными в пространстве и не вращаться с сферами. Texture GLSL, созданная как одна поверхность на одной многоосной вращающейся сфере, разделенной пополам, затем каждая половина сферы превращается в полную сферу < /p>
В этом GIF я попытался создать текстуру GLSL, которая вращает изображение вдоль статической поверхности сферы. Текстура GLSL в основном берет одну сферу и вращает эту сферу. Затем он расщепляет сферу пополам и своего рода «изгибается» каждую половину в полную сферу. Вы можете увидеть в GIF, где края каждого полусферы встречаются после того, как их превратили в полные сферы. Проблема здесь заключается в том, что всякий раз, когда я добавляю изображение в эту текстуру (или даже простой тестовый шаблон, такой как полосы или шашки), текстура ведет себя так, как если бы это было окно, а изображение находится на другой стороне - поэтому изображение на самом деле не движется. Мне нужно, чтобы он вел себя как поверхность, с изображением приклеивалось на него. Но я не могу заставить это сделать это. < /P>
4. Одиночная текстура разделена между обеими сферами, с вращающейся геометрией < /p>
В этом GIF я просто разрезал изображение пополам и кладу каждую половину на сферы, затем поворачиваю сферы. Но это приводит к статической текстуре на поверхностях сфер - она не движется между сферами, и каждая сфера всегда имеет одинаковую часть изображения на ее поверхности. Предполагается, что «шов» между каждой половиной изображения (который вы можете видеть в GIF), всегда выступает с красными линиями, при этом изображение движется между сферами всякий раз, когда он пересекает одну из красных линий с любого направления. Но всякий раз, когда я попробую, либо я получаю поведение на изображении, либо в конечном итоге прокручивая изображение через текстуру, но шов все еще вращается с сферами, потому что текстура привязана к геометрии сфер, которые движутся. Сфера): < /p>
// main.cpp
#include
#include
#define _USE_MATH_DEFINES
#include
#include
#include
#include
#include
// creates two spheres, spins them along three axes with different phases
// creates a texture, splits it between both spheres
// creates two static red 'seam lines'
// does *not* have the desired texture-swapping behavior, where the texture moves between spheres when crossing the red seam lines.
// ---- globals ----
static GLuint texID = 0;
static glm::quat rotQuat(1.0f, 0, 0, 0);
static float angX = 0, angY = 0, angZ = 0;
void createTexture() {
// a simple rainbow texture to show where the texture is split in half across spheres
const int W = 256, H = 1;
// allocate exactly W*H*3 bytes
std::vector data(W * H * 3);
for (int x = 0; x < W; ++x) {
// hue in degrees 0→360
float h = (x / float(W - 1)) * 360.0f;
const float s = 1.0f, l = 0.5f;
// chroma and intermediate
float c = (1.0f - fabsf(2 * l - 1.0f)) * s;
float h_prime = h / 60.0f;
float x_val = c * (1.0f - fabsf(fmodf(h_prime, 2.0f) - 1.0f));
float r1 = 0, g1 = 0, b1 = 0;
if (h_prime < 1.0f) { r1 = c; g1 = x_val; b1 = 0; }
else if (h_prime < 2.0f) { r1 = x_val; g1 = c; b1 = 0; }
else if (h_prime < 3.0f) { r1 = 0; g1 = c; b1 = x_val; }
else if (h_prime < 4.0f) { r1 = 0; g1 = x_val; b1 = c; }
else if (h_prime < 5.0f) { r1 = x_val; g1 = 0; b1 = c; }
else { r1 = c; g1 = 0; b1 = x_val; }
float m = l - c * 0.5f;
unsigned char R = static_cast((r1 + m) * 255.0f);
unsigned char G = static_cast((g1 + m) * 255.0f);
unsigned char B = static_cast((b1 + m) * 255.0f);
data[x * 3 + 0] = R;
data[x * 3 + 1] = G;
data[x * 3 + 2] = B;
}
// upload to GL
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB8, W, H,
0, GL_RGB, GL_UNSIGNED_BYTE,
data.data()
);
}
// draw one hemisphere of the texture on a sphere
void drawSphereHalf(int side) {
glPushMatrix();
// 0) reset the color
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
// 1) apply quaternion rotation
glm::mat4 M = glm::mat4_cast(rotQuat);
glMultMatrixf(glm::value_ptr(M));
// 2) carve out half the texture
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
if (side == 0) {
glScalef(0.5f, 1.0f, 1.0f);
}
else {
glTranslatef(0.5f, 0.0f, 0.0f);
glScalef(0.5f, 1.0f, 1.0f);
}
glMatrixMode(GL_MODELVIEW);
// 3) draw the sphere with the full RGB gradient
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texID);
GLUquadric* q = gluNewQuadric();
gluQuadricTexture(q, GL_TRUE);
gluSphere(q, 1.0, 30, 30);
gluDeleteQuadric(q);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
// draw a fixed red seamline (longitude = 45°) over the front of the sphere
// in the working version, we would expect to see the texture swap from one sphere to the other
// when crossing this line on either sphere
void drawSeam() {
const int STEPS = 100;
const float LON = M_PI / 4.0f;
glDisable(GL_DEPTH_TEST);
glColor3f(1, 0, 0);
glLineWidth(2.0f);
glBegin(GL_LINE_STRIP);
for (int i = 0; i
Вот ссылки на полные проекты для каждого из четырех Gifs: < /p>
Onesphere3axiswholeimage.zip для gif 1 < /p>
twosphere0axisscrollimage.zip для gif 2 < /p>
posposphraxcrollimage.zip для Gif 2 < /p>
posposphraxcrollimage.zip. 3
twosphere3axissplitimage.zip для GIF 4
Подробнее здесь: https://stackoverflow.com/questions/796 ... -is-static
Переместите текстуру между двумя многоосными вращающимися сферами на шов, который статичен в пространстве ⇐ C++
Программы на C++. Форум разработчиков
1746230247
Anonymous
У меня есть личный проект в C ++. < /p>
Я являюсь новичком C ++, поэтому, хотя я много изучал это, стало очевидно, что единственный способ заставить его работать-с глубокими знаниями и опытом, которых у меня нет. Сферы разделяют одну текстуру, которая расширяется на обеих сферах. На «шве», который является статичным в пространстве, текстура меняет поверхности сфер. По сути, это как будто две сферы имеют одну поверхность, и они связаны вместе на «швах», которые являются статичными в пространстве. Это было довольно просто сделать само по себе: < /p>
1. 3D-сфера с текстурой карты на ее поверхности вращается вдоль трех оси на разных фазах < /p>
Второй GIF-это демонстрация поведения с заменой текстуры, к которому я стремлюсь, продемонстрировал на обеих сферах, но используя только одну ось вращения. Это немного чит, так как на этом изображении геометрия сфер на самом деле не вращаются. «Спин» достигается путем прокрутки текстуры на поверхностях сфер, после того, как разрезал текстуру пополам и положив половину на поверхности каждой сферы: < /p>
2. Две 3D -сферы с прокруткой текстуры карты, прокручивая их поверхности и перемещаются от одной сферы к другой на красных швах '< /p>
, но проблема в том, что я не могу получить поведение во втором цифру, если я вращаю сферы «геометрия (потому что тогда он вращается в« Швоте », и я хочу, чтобы я был в« Поведенном поведении », и я не могу быть в поведении. Вращение, перемещая изображение вокруг текстуры (потому что тогда я получаю странные искажения, когда изображение движется к полюсам, и «вращение» не точнее для того, как бы она была бы, если на самом деле вращалась). во втором гифке. Красные шкуры должны оставаться статичными в пространстве и не вращаться с сферами. Texture GLSL, созданная как одна поверхность на одной многоосной вращающейся сфере, разделенной пополам, затем каждая половина сферы превращается в полную сферу < /p>
В этом GIF я попытался создать текстуру GLSL, которая вращает изображение вдоль статической поверхности сферы. Текстура GLSL в основном берет одну сферу и вращает эту сферу. Затем он расщепляет сферу пополам и своего рода «изгибается» каждую половину в полную сферу. Вы можете увидеть в GIF, где края каждого полусферы встречаются после того, как их превратили в полные сферы. Проблема здесь заключается в том, что всякий раз, когда я добавляю изображение в эту текстуру (или даже простой тестовый шаблон, такой как полосы или шашки), текстура ведет себя так, как если бы это было окно, а изображение находится на другой стороне - поэтому изображение на самом деле не движется. Мне нужно, чтобы он вел себя как поверхность, с изображением приклеивалось на него. Но я не могу заставить это сделать это. < /P>
4. Одиночная текстура разделена между обеими сферами, с вращающейся геометрией < /p>
В этом GIF я просто разрезал изображение пополам и кладу каждую половину на сферы, затем поворачиваю сферы. Но это приводит к статической текстуре на поверхностях сфер - она не движется между сферами, и каждая сфера всегда имеет одинаковую часть изображения на ее поверхности. Предполагается, что «шов» между каждой половиной изображения (который вы можете видеть в GIF), всегда выступает с красными линиями, при этом изображение движется между сферами всякий раз, когда он пересекает одну из красных линий с любого направления. Но всякий раз, когда я попробую, либо я получаю поведение на изображении, либо в конечном итоге прокручивая изображение через текстуру, но шов все еще вращается с сферами, потому что текстура привязана к геометрии сфер, которые движутся. Сфера): < /p>
// main.cpp
#include
#include
#define _USE_MATH_DEFINES
#include
#include
#include
#include
#include
// creates two spheres, spins them along three axes with different phases
// creates a texture, splits it between both spheres
// creates two static red 'seam lines'
// does *not* have the desired texture-swapping behavior, where the texture moves between spheres when crossing the red seam lines.
// ---- globals ----
static GLuint texID = 0;
static glm::quat rotQuat(1.0f, 0, 0, 0);
static float angX = 0, angY = 0, angZ = 0;
void createTexture() {
// a simple rainbow texture to show where the texture is split in half across spheres
const int W = 256, H = 1;
// allocate exactly W*H*3 bytes
std::vector data(W * H * 3);
for (int x = 0; x < W; ++x) {
// hue in degrees 0→360
float h = (x / float(W - 1)) * 360.0f;
const float s = 1.0f, l = 0.5f;
// chroma and intermediate
float c = (1.0f - fabsf(2 * l - 1.0f)) * s;
float h_prime = h / 60.0f;
float x_val = c * (1.0f - fabsf(fmodf(h_prime, 2.0f) - 1.0f));
float r1 = 0, g1 = 0, b1 = 0;
if (h_prime < 1.0f) { r1 = c; g1 = x_val; b1 = 0; }
else if (h_prime < 2.0f) { r1 = x_val; g1 = c; b1 = 0; }
else if (h_prime < 3.0f) { r1 = 0; g1 = c; b1 = x_val; }
else if (h_prime < 4.0f) { r1 = 0; g1 = x_val; b1 = c; }
else if (h_prime < 5.0f) { r1 = x_val; g1 = 0; b1 = c; }
else { r1 = c; g1 = 0; b1 = x_val; }
float m = l - c * 0.5f;
unsigned char R = static_cast((r1 + m) * 255.0f);
unsigned char G = static_cast((g1 + m) * 255.0f);
unsigned char B = static_cast((b1 + m) * 255.0f);
data[x * 3 + 0] = R;
data[x * 3 + 1] = G;
data[x * 3 + 2] = B;
}
// upload to GL
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB8, W, H,
0, GL_RGB, GL_UNSIGNED_BYTE,
data.data()
);
}
// draw one hemisphere of the texture on a sphere
void drawSphereHalf(int side) {
glPushMatrix();
// 0) reset the color
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
// 1) apply quaternion rotation
glm::mat4 M = glm::mat4_cast(rotQuat);
glMultMatrixf(glm::value_ptr(M));
// 2) carve out half the texture
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
if (side == 0) {
glScalef(0.5f, 1.0f, 1.0f);
}
else {
glTranslatef(0.5f, 0.0f, 0.0f);
glScalef(0.5f, 1.0f, 1.0f);
}
glMatrixMode(GL_MODELVIEW);
// 3) draw the sphere with the full RGB gradient
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texID);
GLUquadric* q = gluNewQuadric();
gluQuadricTexture(q, GL_TRUE);
gluSphere(q, 1.0, 30, 30);
gluDeleteQuadric(q);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
// draw a fixed red seamline (longitude = 45°) over the front of the sphere
// in the working version, we would expect to see the texture swap from one sphere to the other
// when crossing this line on either sphere
void drawSeam() {
const int STEPS = 100;
const float LON = M_PI / 4.0f;
glDisable(GL_DEPTH_TEST);
glColor3f(1, 0, 0);
glLineWidth(2.0f);
glBegin(GL_LINE_STRIP);
for (int i = 0; i
Вот ссылки на полные проекты для каждого из четырех Gifs: < /p>
Onesphere3axiswholeimage.zip для gif 1 < /p>
twosphere0axisscrollimage.zip для gif 2 < /p>
posposphraxcrollimage.zip для Gif 2 < /p>
posposphraxcrollimage.zip. 3
twosphere3axissplitimage.zip для GIF 4
Подробнее здесь: [url]https://stackoverflow.com/questions/79603084/move-a-texture-between-two-multi-axis-rotating-spheres-at-a-seam-that-is-static[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия