2017-10-29 11 views
-1

메신저는 시간상 번역하는 방법을 이해하려고 시도하고 두 개의 삼각형으로 만든 내 사각형에서 수행합니다. 내 운동은 사각형을 Y 축 배율 -0.5와 0.5로 이동하는 것입니다. 나는이 시간 변수를 사용하는 팁을 가지고OpenGL에서 삼각형으로 만든 정사각형의 번역

glm::mat4 translation 

하고 보내

glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&translation); 

을 쉐이더 :

const float vertexArray[] = 
{ 
    -0.5f, -0.5f, 0.0f, 1.0f, 
    0.5f, -0.5f, 0.0f, 1.0f, 
    0.5f, 0.5f, 0.0f, 1.0f, 
    -0.5f, 0.5f, 0.0f, 1.0f 
}; 

const int arrayIndexes[] = {0,1,2,3,0,2}; 

다음으로 내가 매트릭스 만든 : 나는 버퍼 내 verticles했다 다음과 같이 정의됩니다.

float time = glutGet(GLUT_ELAPSED_TIME)/1000.0f; 

fmodf 기능. 나는 간단한 단계에서 그것을 시도하고 난이

glm::mat4 translation = { 
     1.0, 0.0, 0.0, 0.5, 
     0.0, 1.0, 0.0, 0.0, 
     0.0, 0.0, 1.0, 0.0, 
     0.0, 0.0, 0.0, 1.0, 
    }; 

으로 행렬을 definied 그리고 화면의 상단에 사각형을 밀어

#version 430 core 

layout(location = 0) in vec4 vertexPosition; 

uniform mat4 transformation; 

void main() 
{ 
    gl_Position = vertexPosition * transformation; 
} 

: 이 같은 버텍스 쉐이더는 모습입니다 하지만 나는 그것을 움직이게하고 그것을 beetwen -0.5와 0.5로 만드는 방법을 모른다. 저는 또한 Y로 변환 행렬에서 시간을 곱해서, 이제는 양의 방향으로 만 이동합니다. 어떻게 0.5에서 -0.5 사이로 움직일 수 있습니까?

glm::mat4 Core::createPerspectiveMatrix(float zNear, float zFar) 

    { 
     const float frustumScale = 1.1f; 
     glm::mat4 perspective; 
     perspective[0][0] = frustumScale; 
     perspective[1][1] = frustumScale; 
     perspective[2][2] = (zFar + zNear)/(zNear - zFar); 
     perspective[3][2] = (2 * zFar * zNear)/(zNear - zFar); 
     perspective[2][3] = -1; 
     perspective[3][3] = 0; 

     return perspective; 
    } 

glm::mat4 perspective = createPerspectiveMatrix(0.1f, 10.0f); 

    transformation = perspective; 

glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); 
쉐이더에

발송에 실패 모든 :



는 오늘 더 가서 난 내 프로젝트와 관점 행렬에 상자를 추가

layout(location = 0) in vec4 vertexPosition; 
layout(location = 1) in vec4 vertexColor; 

    uniform mat4 transformation; 

    out vec4 color; 
    void main() 
    { 
     color = vertexColor; 
     gl_Position = transformation * vertexPosition; 
    } 

가 나는 또한 번역 그러나 그것을 발송에 실패 그것을 didnt는 많이 바뀐다, 상자는 단지 내가 사용했던 축에서 움직였다. 내가 만에 입장을 사용하는 경우는 다음과 같습니다

image

관점만을 사용에 대한 결과 미세인가? 3D로 보일까?

+0

당신 행렬에'sin (time)/2'을'0.5' 대신에 넣을 수 있습니다. – HolyBlackCat

+0

멋지지만 완벽하게 작동하지만 팁으로 fmod를 사용해야하는 이유는 무엇입니까? – titans

+0

그 점에 대해서만 추측 할 수 있습니다. 팁을 준 사람은 누구에게 물어봐야합니다. – HolyBlackCat

답변

0

알아야 할 것이 몇 가지 있습니다. 수동으로 변환 행렬을 설정하는 대신 glm::translate을 사용하면 솔루션을 변경하지 않고도 작동하지 않습니다.

4 * 4 행렬은 다음과 같다 :

c0 c1 c2 c3   c0 c1 c2 c3 
[ Xx Yx Zx Tx ]  [ 0 4 8 12 ]  
[ Xy Yy Zy Ty ]  [ 1 5 9 13 ]  
[ Xz Yz Zz Tz ]  [ 2 6 10 14 ]  
[ 0 0 0 1 ]  [ 3 7 11 15 ] 

시키고, 4 * 4 매트릭스의 메모리 이미지는 다음과 같다 :

GLSL에서
[ Xx, Xy, Xz, 0, Yx, Yy, Yz, 0, Zx, Zy, Zz, 0, Tx, Ty, Tz, 1 ] 

mat4 m44 이렇게 initilaized된다 () GLSL 4×4 Matrix Fields 참조 :

mat4 m44 = mat4(
    vec4(Xx, Xy, Xz, 0.0), 
    vec4(Yx, Xy, Yz, 0.0), 
    vec4(Zx Zy Zz, 0.0), 
    vec4(Tx, Ty, Tz, 1.0)); 

및 C

가 OpengGL 행렬 ++ 01,237,064,817,799,419 79,843,210는 다음과 같이 초기화 :
glm::mat4 translation = { 
    1.0, 0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0, 0.0, 
    0.0, 0.0, 1.0, 0.0, 
    0.5, 0.0, 0.0, 1.0, 
}; 

,이 glm::translate가하는 일이 될 것입니다 : 이것은이처럼 행렬을 초기화하는 것을 의미

glm::mat4 m44 = { 
    Xx, Xy, Xz, 0.0, 
    Yx, Xy, Yz, 0.0, 
    Zx Zy Zz, 0.0, 
    Tx, Ty, Tz, 1.0 }; 


.

glm::mat4 translation = glm::translate(glm::mat4(), glm::vec3(0.5, 0.0, 0.0)); 


또한 GLSL Programming/Vector and Matrix Operations 참조 : 또한

상기 * -operator은 대응 차원의 행렬 - 벡터 제품, 예를 들어 사용될 수

vec2 v = vec2(10., 20.); 
mat2 m = mat2(1., 2., 3., 4.); 
vec2 w = m * v; // = vec2(1. * 10. + 3. * 20., 2. * 10. + 4. * 20.) 

참고 벡터는 오른쪽에서 행렬에 곱해야합니다.

왼쪽에서 행렬에 벡터를 곱하면 그 결과는 열 벡터를 오른쪽에서부터 전치 행렬에 곱하는 것과 같습니다.

vec2 v = vec2(10., 20.); 
mat2 m = mat2(1., 2., 3., 4.); 
vec2 w = v * m; // = vec2(1. * 10. + 2. * 20., 3. * 10. + 4. * 20.) 

: 해당 전치 행렬을 오른쪽에서 승산으로 행렬의 좌측에서 벡터 승산 따라서

이 오른쪽에서 전치 행렬의 열 벡터 곱에 해당

gl_Position = transformation * vertexPosition; 

Data Type (GLSL)

를 참조하십시오
이는이 같은 GLSL 코드를 변경해야 의미 0


왼쪽에서 행렬에 벡터를 곱하면 그 결과는 오른쪽에있는 전치 행렬에 벡터를 곱한 결과입니다. 전치 된 행렬로 유니폼을 초기화하고 왼쪽에서부터 행렬에 벡터를 곱합니다.
하지만 glm::translate을 사용하는 경우, 당신은 당신이 매트릭스에 오른쪽에서 벡터를 곱해야 할 것 중 하나

gl_Position = vertexPosition * transformation; 

하거나 전치 행렬로 유니폼을 initiilaize 할 것이다 (glUniformMatrix4fv 참조) : 쿼드 애니메이션을하는

glUniformMatrix4fv(.... , 1, GL_TRUE, .....); 


하나의 가능성은 시간에 따라 변환 행렬을 설정하는 것입니다. -1과 1 사이의 원활한 이동은 sin 기능에 의해 달성 될 수있다 : 물론

#include <math.h> 

float time_interval_in_s = .....; // time interval in seconds 
float amplitude   = 0.5f; 

float time = glutGet(GLUT_ELAPSED_TIME)/1000.0f; 
float trans = amplitude * sin(time * M_PI * 2.0/time_interval_in_s); 

glm::mat4 translation = { 
    1.0, 0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0, 0.0, 
    0.0, 0.0, 1.0, 0.0, 
    trans, 0.0, 0.0, 1.0, 
}; 

셰이더 프로그램 (glUniformMatrix4fv)의 균일 한 값을 업데이트한다. fmod를 참조 -


double fmod (double numer, double denom);은 (0에 가까워 반올림) numer/denom의 부동 소수점 나머지를 반환합니다. 당신이 sin의 결과 becaus sin 기능을 사용하는 경우이 필요하지 사이 -1 일에 관계없이 입력에 항상,하지만 당신은 다음과 같이 사용할 수 있습니다 :

float time   = glutGet(GLUT_ELAPSED_TIME)/1000.0f; 
float fSawtooth  = fmod(time, time_interval_in_s)/time_interval_in_s; 
fSawtooth    = fSawtooth * 2.0f - 1.0f; 
float trans   = amplitude * fSawtooth; 
glm::mat4 translation = glm::translate(glm::mat4(), glm::vec3(trans, 0.0, 0.0)); 

또는

float time   = glutGet(GLUT_ELAPSED_TIME)/1000.0f; 
float fTriangle  = fmod(time, time_interval_in_s)/time_interval_in_s; 
if (fTriangle > 0.5f) 
    fTriangle = (0.75f-fTriangle)*4.0f; 
else 
    fTriangle = (fTriangle-0.25f)*4.0f; 
float trans   = amplitude * fTriangle; 
glm::mat4 translation = glm::translate(glm::mat4(), glm::vec3(trans, 0.0, 0.0)); 
+1

오늘 조금 늦었습니다. 그래서 tommorow에 응답 할 것입니다. – titans

+0

행렬을 이항하고 곱셈 순서를 역전하면 서로 취소됩니다. OP의 코드에는 아무런 문제가 없으며 보통의 규칙을 따르지 않습니다. – HolyBlackCat

+0

@HolyBlackCat 그렇습니다. 그러나'glm :: lookAt','glm :: ortho','glm :: perspective','glm :: translate'와 같은 다른'glm' 함수를 사용하면 다른 것입니다. – Rabbid76