2017-11-08 9 views
2

잘못된 값으로 행렬을 출력 :: 기능을 번역 : 대신"GLM : 번역은"나는 GLM 테스트를 위해 샘플 코드를했다

-4.29497e+08, -4.29497e+08, -4.29497e+08 

:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f); 
glm::mat4 trans; 
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f)); 
vec = trans * vec; 
std::cout << vec.x << ", " << vec.y << ", " << vec.z << std::endl; 

그것은 다음과 같은 출력 예상 됨 2, 1, 0

가능한 원인은 무엇이며 어떻게해야합니까?

는 (나는 외부 결함이 코드 조각을 검색해야합니까?)

+0

당신이 정답은 '2, 1, 0'무엇이라고 생각하게 번역 매트릭스 초기화? 디버거로 코드를 밟았습니까? MS VS 2017에는 멋진 그래픽 디버거가 내장되어 있습니다. – iksemyonov

+0

문제점을 재현 할 수 없습니다. 위의 코드에서 출력은'2, 1, 0'이됩니다. – BDL

+2

재생할 수 없습니다. 건설 직후에'트랜스'의 구성 요소는 무엇입니까? 필자는'glm'의 이전 버전을 생각해 봅니다.'mat4' 기본 생성자가 구성 요소를 단위 행렬이 아닌 초기화되지 않은 채로 남겨 두었습니다. –

답변

5
-4.29497e+08 

이 결함이 거짓말을 믿고 나를 이끌 것 언더 플로우, 모양의 :

glm::mat4 trans; 

행렬을 초기화하지 않았지만 행렬에 대해 산술 연산을 수행했습니다. 생성자가 메모리를 초기화한다고 가정 할 수 없으므로 다음으로 변경하십시오.

glm::mat4 trans(1.0f); 

그러면 언더 플로우가 수정되어야합니다.

+0

레코드 용 : 새로운 버전의 glm에서 기본 생성자는 항상 항등 행렬을 생성합니다. – BDL

+1

아마 그렇지만 좋은 프로그래밍 방법을 따르는 경우 RAII (Resource Acquisition Is Initialisation)를 사용해야합니다. 초기화되지 않은 항목은 많은 수의 버그를 설명하므로이 습관으로 들어가면 더 안정적인 코드가됩니다. –

-1

glm::mat4 trans(1);