앰비언트, 확산 및 반사의 세 배열을 저장하는 재질 구조체가 있습니다. 단일 개체의 재질에 대한 정보를 저장하는 데 사용하고 있습니다. 헤더 파일 :배열 멤버가있는 구조체
struct Material
{
float (&ambient)[4], (&diffuse)[4], (&specular)[4];
Material(float (&ambient)[4], float (&diffuse)[4], float (&specular)[4]);
float* Ambient();
float* Diffuse();
float* Specular();
}
소스 파일 :
이float random(float min, float max)
{
return min + static_cast<float> (rand())/static_cast<float> (RAND_MAX/(max - min));
}
void createBall(int)
{
float ambient[] = {random(0, 1), random(0, 1), random(0, 1), 1};
float diffuse[] = {random(0, 1), random(0, 1), random(0, 1), 1};
float specular[] = {random(0, 1), random(0, 1), random(0, 1), 1};
(...)
ballMaterials.push_back(Material(ambient, diffuse, specular));
}
그리고 그리기 기능 :
void drawBall(float radius, Vector3& position, Material material, Rigidbody rigidbody)
{
(...)
glMaterialfv(GL_FRONT,GL_AMBIENT,material.Ambient());
glMaterialfv(GL_FRONT,GL_DIFFUSE,material.Diffuse());
glMaterialfv(GL_FRONT,GL_SPECULAR,material.Specular());
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glPushMatrix();
(...)
glScalef(radius, radius, radius);
glCallList(index);
glPopMatrix();
glutPostRedisplay();
}
뭔가가
Material::Material(float (&_ambient)[4], float (&_diffuse)[4], float (&_specular)[4]): ambient{_ambient}, diffuse{_diffuse}, specular{_specular}{}
float* Material::Ambient()
{
return ambient;
}
float* Material::Diffuse()
{
return diffuse;
}
float* Material::Specular()
{
return specular;
}
나는 객체 초기화이 기능이 공이 평평하고 붉은 색이어서 무작위 색이 아니기 때문에 매우 잘못되었습니다. 내가 잘못된 방법으로 구조체를 구현 한 것 같아요 (배열 구성원) 그 문제를 해결하는 방법을 잘 모르겠습니다. 당신이 나를 도울 수?
사라질 지역 변수를 참조하는 것이 좋지 않습니다. 참조가있는 대신 배열의 내용을 복사 해보십시오. – MikeCAT
3 개의 배열을 저장하는'Material' 구조체가 없습니다. 배열에 3 개의 * 참조를 저장하는 구조체 만 있습니다. – MikeCAT
dumb float 배열과 float 포인터 대신에'std :: array'을 사용하면 모든 문제가 사라집니다. –
PaulMcKenzie