Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios OpenGL ES 1缩放而不更改对象上的照明?_Ios_3d_Opengl Es 1.1 - Fatal编程技术网

Ios OpenGL ES 1缩放而不更改对象上的照明?

Ios OpenGL ES 1缩放而不更改对象上的照明?,ios,3d,opengl-es-1.1,Ios,3d,Opengl Es 1.1,我正在实现一个类似3d obj查看器的应用程序,当我在应用程序(OpenGL ES 1.x)中对我的对象进行缩放时,它变得更亮(向下缩放)和更暗(向上缩放) 我有没有办法阻止这种“改变照明”的发生?i、 e.相同的亮度均匀通过 我想我必须对照明法线做些什么 我的渲染方法如下: void RenderingEngine::Render(const vector<Visual>& visuals, ivec2 screenSize) const { glClearColor(0.

我正在实现一个类似3d obj查看器的应用程序,当我在应用程序(OpenGL ES 1.x)中对我的对象进行缩放时,它变得更亮(向下缩放)和更暗(向上缩放)

我有没有办法阻止这种“改变照明”的发生?i、 e.相同的亮度均匀通过

我想我必须对照明法线做些什么

我的渲染方法如下:

void RenderingEngine::Render(const vector<Visual>& visuals, ivec2 screenSize) const
{
glClearColor(0.5f, 0.5f, 0.5f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

vector<Visual>::const_iterator visual = visuals.begin();
for (int visualIndex = 0; visual != visuals.end(); ++visual, ++visualIndex) {

    // Set the viewport transform.
    ivec2 size = visual->ViewportSize;
    ivec2 lowerLeft = visual->LowerLeft;
    glViewport(lowerLeft.x, lowerLeft.y, size.x, size.y);

    // Set the light position.
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    vec4 lightPosition(0.25, 0.25, 1, 0);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition.Pointer());

    // Set the model-view transform.
    mat4 rotation = visual->Orientation.ToMatrix();
    mat4 translation = visual->Translate;
    mat4 scale;
    scale = scale.Scale(visual->Scale);
    rotation = rotation * scale;
    //mat4 modelview = rotation * m_translation;
    mat4 modelview = rotation * m_translation * translation;

    glLoadMatrixf(modelview.Pointer());

    // Set the projection transform.
    float h = 4.0f * size.y / size.x;
    mat4 projection = mat4::Frustum(-2, 2, -h / 2, h / 2, 5, 50);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf(projection.Pointer());

    // Set the diffuse color.
    vec3 color = visual->Color * 0.75f;
    vec4 diffuse(color.x, color.y, color.z, 1);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse.Pointer());

    // Draw the surface.
    int stride = 2 * sizeof(vec3);
    const GLvoid* normalOffset = (const GLvoid*) sizeof(vec3);
    const Drawable& drawable = m_drawables[visualIndex];
    glBindBuffer(GL_ARRAY_BUFFER, drawable.VertexBuffer);
    glVertexPointer(3, GL_FLOAT, stride, 0);
    glNormalPointer(GL_FLOAT, stride, normalOffset);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, drawable.IndexBuffer);
    glDrawElements(GL_TRIANGLES, drawable.IndexCount, GL_UNSIGNED_SHORT, 0);
}
}
void RenderingEngine::Render(常量向量和视觉,ivec2屏幕大小)常量
{
glClearColor(0.5f,0.5f,0.5f,1);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
vector::const_iterator visual=visuals.begin();
对于(int visualIndex=0;visual!=visuals.end();++visual,++visualIndex){
//设置视口变换。
ivec2大小=可视->视口大小;
ivec2 lowerLeft=视觉->lowerLeft;
glViewport(lowerLeft.x,lowerLeft.y,size.x,size.y);
//设置灯光位置。
glMatrixMode(GLU模型视图);
glLoadIdentity();
vec4光位(0.25,0.25,1,0);
glLightfv(GL_LIGHT0,GL_位置,lightPosition.Pointer());
//设置模型视图变换。
mat4旋转=视觉->方向.ToMatrix();
mat4翻译=视觉->翻译;
mat4量表;
比例=比例。比例(视觉->比例);
旋转=旋转*比例;
//mat4模型视图=旋转*m_平移;
mat4模型视图=旋转*m_平移*平移;
glLoadMatrixf(modelview.Pointer());
//设置投影变换。
浮点数h=4.0f*size.y/size.x;
mat4投影=mat4::平截头体(-2,2,-h/2,h/2,5,50);
glMatrixMode(GL_投影);
glLoadMatrixf(projection.Pointer());
//设置漫反射颜色。
vec3颜色=视觉->颜色*0.75f;
vec4漫反射(color.x,color.y,color.z,1);
glmaterialpv(GL_FRONT_AND_BACK,GL_DIFFUSE,DIFFUSE.Pointer());
//画表面。
int-stride=2*sizeof(vec3);
常量GLvoid*normalOffset=(常量GLvoid*)sizeof(vec3);
常量可抽电缆和可抽电缆=m_可抽电缆[visualIndex];
glBindBuffer(GL_数组_BUFFER,drawable.VertexBuffer);
glVertexPointer(3,GLU浮动,步幅,0);
glNormalPointer(GL_浮点、步幅、法线偏移);
glBindBuffer(GL_元素_数组_缓冲区,drawable.IndexBuffer);
GLD元素(GL_三角形,可绘制。索引计数,GL_无符号\u短,0);
}
}

首先,在变换矩阵之前应用旋转和缩放矩阵。所以与此相反:

rotation = rotation * scale;
//mat4 modelview = rotation * m_translation;
mat4 modelview = rotation * m_translation * translation;
这样做:

rotation = rotation * scale;
//mat4 modelview = rotation * m_translation;
mat4 modelview = m_translation * translation * rotation;
第二,为什么有两个转换矩阵?您应该只需要一个矩阵就可以将对象顶点从对象空间转换到世界空间


第三,为什么要创建法线矩阵?除非在旋转后修改某些剪切对象的法线,否则我看不出有任何理由这样做。可以使用与顶点相同的旋转矩阵旋转对象的法线。

此解决方案适合我。因此,我将与任何遇到与我相同问题的新手分享这一点

使用:


始终将曲面法线规格化为单位长度。

关于最后一个问题,我真的很抱歉!由于我同时实现了ES1.x和ES2.x以实现设备兼容性,因此我无意中附加了来自ES2.x渲染方法的代码,而不是我打算附加的ES1.x代码。我对这个问题进行了必要的编辑。首先,我之所以在翻译后放置旋转矩阵,是因为我的应用程序类似于3d obj查看器。在这里,我加载一个.obj文件,并通过一些多点触控手势查看它。很抱歉,我之前没有提到这一点。其次,由于它是一个3d obj查看器,我做了一个翻译,将对象“放在”屏幕后面,即m_翻译,然后在应用程序运行期间,我将使用用户输入的“翻译”来翻译模型,因此使用两个不同的翻译矩阵。哦,好的,这更有意义。是否将平移矩阵应用于法线?因为它们应该只与旋转矩阵相乘。我没有直接对法线应用任何变换,但我不能太确定是否间接应用了变换。。因为我对这个问题还很陌生。不管怎样,我刚刚找到了解决问题的办法。我启用opengl函数将法线规格化为单位长度。虽然它可能会导致一些性能的下降,但至少它解决了手头的问题。感谢您的时间和回复!
glEnable(GL_NORMALIZE);