현재 워크 플로에서 Blender에서 Python으로 다양한 정보 (정점 색상, UV 좌표 등)와 함께 3D 모델을 내보내고 있습니다. 이것은 C++로 읽을 수있는 바이너리 파일에 저장됩니다.포인터 값이 앞의 값의 영향을받는 것 같습니다.
파이썬 :
ar = [0, 1, 2, 3, 4]
with open('model.bin', 'wb') as file:
file.write(struct.pack('%si' & len(ar), *ar))
C++ :
u32* ar = (u32*) model_bin; //model_bin is already declared externally
for(int i=0; i<5; i++){
printf("%d\n", ar[i]);
}이 작동
는 다음 코드를 살펴 보자! 그러나 내 파일에는 하나 이상의 데이터 목록이 포함되어 있습니다. 그것은 다양한 유형의 많은 데이터를 포함합니다. 각 새로운 "요소"의 시작 부분에서 다른 포인터를 사용하여이를 추적합니다. 예 :
rgb* vcols = (rgb*) model_bin;
u32* uvco = (u32*) ((char*) vcols + 2*numVcols)
지금 자외선 텍스처의 첫 번째 값을 제외하고 모든 것이 체크 아웃됩니다. 내 내보내기 스크립트에서이를 0으로 설정하면 내 C++ 응용 프로그램이 -566558720으로 읽습니다.
그러나 UV 좌표를 반바지로 내보내고 읽으면 모든 것이 잘 동작합니다.
하지만 더 좋아집니다. 마지막 vcol [] 요소의 값을 0으로 설정하면 작성된 int를 잘 읽을 수 있습니다! 최종 vcol을 1로 설정하면 첫 번째 uvco가 65578로 읽혀집니다.
실제 코드를 보지 않고 디버깅하는 것은 매우 까다 롭지 만이 정보를 기반으로 몇 가지 통찰력이나 제안을 줄 수 있습니까?
감사합니다,
패트릭
편집 : 그것은 정말 RGB []입니다 반면, 실수, U16 []로 vcols을 썼다. rgb는 unsigned short 형식의 typedef입니다.
u16 및 u32의 유형은 무엇입니까? – 101010
정수 오버 플로우와 같은 냄새가납니다. Karmic 당신이 stackoverflow에 있기 때문에 :) – 101010
@ 40two 그들은 각각 uint16_t과 uint32_t입니다. =) 오버플로가 발생하면 왜 내가 이전에 그것을 보지 못했을까요? 이전 버텍스 색상 또는 이전 요소를 사용 했습니까? – Senshi