В настоящее время я разрабатываю загрузчик модели 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
Модель GLB неправильно воспроизводит? [закрыто] ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как заменить сущность игрока коробки на модель GLB в NOA.JS + Babylon.js Game
Anonymous » » в форуме Html - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как заменить сущность игрока коробки на модель GLB в NOA.JS + Babylon.js Game
Anonymous » » в форуме CSS - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-