Модель GLB неправильно воспроизводит? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Модель GLB неправильно воспроизводит? [закрыто]

Сообщение Anonymous »

В настоящее время я разрабатываю загрузчик модели GLB с использованием WebGL и WebAssembly (через Emscripten). Тем не менее, я сталкиваюсь с проблемой, в которой модель не отображается правильно, несмотря на то, что файл .glb был полностью функциональным-я подтвердил, что она правильно отображается у других, совместимых с GLTF. моего результата "src =" https://i.sstatic.net/eiwd3cvi.png "/>
Модель с другого веб-сайта GLB-погрузчика

Код
#include
#include
#include
#include
#include
#include
#include

// Orbit controller state
float cameraDistance = 5.0f;
float cameraAngleX = 0.0f;
float cameraAngleY = 0.0f;
int prevMouseX = 0;
int prevMouseY = 0;
bool isDragging = false;

// Model data
std::vector vertices;
std::vector normals;
GLuint vbo = 0;
GLuint normalVBO = 0;
int vertexCount = 0;

// Shader program
GLuint shaderProgram;

// Matrix uniforms
GLuint modelMatrixLoc;
GLuint viewMatrixLoc;
GLuint projectionMatrixLoc;

// Camera setup
float cameraPos[3] = {0.0f, 0.0f, cameraDistance};
float cameraTarget[3] = {0.0f, 0.0f, 0.0f};
float cameraUp[3] = {0.0f, 1.0f, 0.0f};

// Fixed shader sources
const char* vertexShaderSource = R"(
attribute vec3 position;
attribute vec3 normal;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
varying vec3 vNormal;
void main() {
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
vNormal = normal;
}
)";

const char* fragmentShaderSource = R"(
precision mediump float;
varying vec3 vNormal;
void main() {
vec3 lightDir = normalize(vec3(0.5, 1.0, 0.7));
float diff = max(dot(normalize(vNormal), lightDir), 0.0);
vec3 color = vec3(1.0, 1.0, 1.0) * (0.3 + 0.7 * diff);
gl_FragColor = vec4(color, 1.0);
}
)";

GLuint compileShader(GLenum type, const char* source) {
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);

GLint success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
char infoLog[512];
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cerr clientX - prevMouseX;
int deltaY = e->clientY - prevMouseY;
prevMouseX = e->clientX;
prevMouseY = e->clientY;

// Fixed: Changed rotation directions to be more intuitive
cameraAngleY -= deltaX * 0.01f; // Left/right movement rotates around Y-axis
cameraAngleX += deltaY * 0.01f; // Up/down movement rotates around X-axis

// Clamp vertical rotation to prevent flipping
cameraAngleX = fmax(-M_PI_2 + 0.1f, fmin(M_PI_2 - 0.1f, cameraAngleX));

updateCameraPosition();
}
return EM_TRUE;
}

EM_BOOL mouseWheel(int eventType, const EmscriptenWheelEvent* e, void* userData) {
// Fixed: Corrected zoom direction
cameraDistance += e->deltaY * 0.1f;
cameraDistance = fmax(1.0f, fmin(50.0f, cameraDistance));
updateCameraPosition();
return EM_TRUE;
}

void createLookAtMatrix(float* matrix, float* eye, float* target, float* up) {
float f[3] = {target[0]-eye[0], target[1]-eye[1], target[2]-eye[2]};
float fLength = sqrt(f[0]*f[0] + f[1]*f[1] + f[2]*f[2]);
f[0] /= fLength; f[1] /= fLength; f[2] /= fLength;

float s[3] = {
f[1]*up[2] - f[2]*up[1],
f[2]*up[0] - f[0]*up[2],
f[0]*up[1] - f[1]*up[0]
};
float sLength = sqrt(s[0]*s[0] + s[1]*s[1] + s[2]*s[2]);
s[0] /= sLength; s[1] /= sLength; s[2] /= sLength;

float u[3] = {
s[1]*f[2] - s[2]*f[1],
s[2]*f[0] - s[0]*f[2],
s[0]*f[1] - s[1]*f[0]
};

matrix[0] = s[0]; matrix[4] = s[1]; matrix[8] = s[2]; matrix[12] = -s[0]*eye[0]-s[1]*eye[1]-s[2]*eye[2];
matrix[1] = u[0]; matrix[5] = u[1]; matrix[9] = u[2]; matrix[13] = -u[0]*eye[0]-u[1]*eye[1]-u[2]*eye[2];
matrix[2] =-f[0]; matrix[6] =-f[1]; matrix[10]=-f[2]; matrix[14] = f[0]*eye[0]+f[1]*eye[1]+f[2]*eye[2];
matrix[3] = 0.0f; matrix[7] = 0.0f; matrix[11]= 0.0f; matrix[15] = 1.0f;
}

void createPerspectiveMatrix(float* matrix, float fov, float aspect, float near, float far) {
float f = 1.0f / tan(fov * 0.5f);
for (int i = 0; i < 16; i++) matrix = 0.0f;
matrix[0] = f / aspect;
matrix[5] = f;
matrix[10] = (far + near) / (near - far);
matrix[11] = -1.0f;
matrix[14] = (2.0f * far * near) / (near - far);
}

void initGL() {
// Use fixed shaders
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderSource);
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderSource);

shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);

GLint success;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
char infoLog[512];
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cerr

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как заменить сущность игрока коробки на модель GLB в NOA.JS + Babylon.js Game
    Anonymous » » в форуме Html
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как заменить сущность игрока коробки на модель GLB в NOA.JS + Babylon.js Game
    Anonymous » » в форуме CSS
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Пусто {} или неопределенный ответ при RayCasting GLB 3D -модель для извлечения пользовательских данных
    Anonymous » » в форуме Javascript
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • AudioTrack на Android неправильно воспроизводит потоковые аудиобайты
    Anonymous » » в форуме Android
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как добавить документ GLB в основное веб -приложение ASP.NET? [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

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