Переместите текстуру между двумя многоосными вращающимися сферами на шов, который статичен в пространствеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Переместите текстуру между двумя многоосными вращающимися сферами на шов, который статичен в пространстве

Сообщение Anonymous »

Я мог бы использовать некоторую помощь с личным проектом в 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 

Подробнее здесь: [url]https://stackoverflow.com/questions/79603084/move-a-texture-between-two-multi-axis-rotating-spheres-at-a-seam-that-is-static[/url]
Ответить

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

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

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

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

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