Задать вопрос
@l07v0212

Как разместить фигуру внутри фигуры?

Объясните как сделать правильно.

Создание двух фигур:
private void drawPar(float w, float h, float d)
 {
     gl.Begin(OpenGL.GL_QUADS);
     // +z
     gl.Normal(0.0f, 0.0f, 1.0f);
     gl.Vertex(-w / 2, -h / 2, -d / 2);
     gl.Vertex( w / 2, -h / 2, -d / 2);
     gl.Vertex( w / 2,  h / 2, -d / 2);   
     gl.Vertex(-w / 2,  h / 2, -d / 2);   

     // -z
     gl.Normal(0.0f, 0.0f, -1.0f);
     gl.Vertex(-w / 2, -h / 2,  d / 2);   
     gl.Vertex(-w / 2,  h / 2,  d / 2); 
     gl.Vertex( w / 2,  h / 2,  d / 2); 
     gl.Vertex( w / 2, -h / 2,  d / 2);   

     // -x
     gl.Normal(-1.0f, 0.0f, 0.0f);
     gl.Vertex(-w / 2, -h / 2, -d / 2); 
     gl.Vertex(-w / 2, -h / 2,  d / 2);  
     gl.Vertex(-w / 2,  h / 2,  d / 2); 
     gl.Vertex(-w / 2,  h / 2, -d / 2); 

     // x
     gl.Normal(1.0f, 0.0f, 0.0f);
     gl.Vertex( w / 2, -h / 2, -d / 2); 
     gl.Vertex( w / 2,  h / 2, -d / 2);   
     gl.Vertex( w / 2,  h / 2,  d / 2);    
     gl.Vertex( w / 2, -h / 2,  d / 2);   

     // y
     gl.Normal(0.0f, 1.0f, 0.0f);
     gl.Vertex(-w / 2,  h / 2, -d / 2);
     gl.Vertex( w / 2,  h / 2, -d / 2); 
     gl.Vertex( w / 2,  h / 2,  d / 2); 
     gl.Vertex(-w / 2,  h / 2,  d / 2);

     // -y
     gl.Normal(0.0f, -1.0f, 0.0f);
     gl.Vertex(-w / 2, -h / 2, -d / 2);
     gl.Vertex(-w / 2, -h / 2,  d / 2);  
     gl.Vertex( w / 2, -h / 2,  d / 2); 
     gl.Vertex( w / 2, -h / 2, -d / 2);
     gl.End();
 }

        private void drawRiver(float h)
        {
            //h += 0.1f;
            PointF[] pointsXZ =
{
                new PointF( 0.1f,   0.5f),
                new PointF( 0.05f,  0.2f),
                new PointF( 0.0f,   0.0f),
                new PointF(-0.2f,  -0.5f),
                  
                new PointF( 0.0f,  -0.5f),
                new PointF(-0.2f,  -0.3f),
                new PointF( 0.25f,  0.0f),
                new PointF( 0.3f,   0.5f)
            };

            gl.Color(0.7f, 0.9f, 1.0f);

            gl.Begin(OpenGL.GL_POLYGON);
            foreach (PointF p in pointsXZ)
            {
                gl.Vertex(p.X, h/2, p.Y);
            }
            gl.End();

            gl.Begin(OpenGL.GL_POLYGON);
            foreach (PointF p in pointsXZ)
            {
                gl.Vertex(p.X,  -h/2, p.Y);
            }
            gl.End();

            for (int i = 0; i < pointsXZ.Count() - 1; i++)
            {
                gl.Begin(OpenGL.GL_QUADS);
                gl.Vertex(pointsXZ[i].X, h / 2, pointsXZ[i].Y);
                gl.Vertex(pointsXZ[i].X, -h / 2, pointsXZ[i].Y);
                gl.Vertex(pointsXZ[i + 1].X, -h / 2, pointsXZ[i + 1].Y);
                gl.Vertex(pointsXZ[i + 1].X, h / 2, pointsXZ[i + 1].Y);
                gl.End();
            }
            gl.Begin(OpenGL.GL_QUADS);
            gl.Vertex(pointsXZ[0].X, h / 2, pointsXZ[0].Y);
            gl.Vertex(pointsXZ[0].X, -h / 2, pointsXZ[0].Y);
            gl.Vertex(pointsXZ[pointsXZ.Count() - 1].X, -h / 2, pointsXZ[pointsXZ.Count() - 1].Y);
            gl.Vertex(pointsXZ[pointsXZ.Count() - 1].X, h / 2, pointsXZ[pointsXZ.Count() - 1].Y);
            gl.End();
}

Здесь я пытаюсь разметисть реку в блоке:
private void drawSnowyGround()
 {
     float height = 0.5f;
//попытка №1:
     //gl.Enable(OpenGL.GL_STENCIL_TEST);
     //gl.StencilFunc(OpenGL.GL_ALWAYS, 1, 0xFF);
     //gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_REPLACE);
     //gl.Color(1f, 1f, 1f);
     //drawPar(1f, height, 1f);

     //gl.StencilFunc(OpenGL.GL_EQUAL, 1, 0xFF);
     //gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_KEEP);
     //gl.Enable(OpenGL.GL_DEPTH_TEST);
     //drawRiver(height);


// попытка №9380:
     gl.Enable(OpenGL.GL_STENCIL_TEST);
     gl.Clear(OpenGL.GL_STENCIL_BUFFER_BIT);
     gl.StencilFunc(OpenGL.GL_ALWAYS, 1, 0xFF);
     gl.StencilOp(OpenGL.GL_REPLACE, OpenGL.GL_REPLACE, OpenGL.GL_REPLACE);
     drawRiver(height);
     gl.StencilFunc(OpenGL.GL_NOTEQUAL, 1, 0xFF);
     gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_KEEP);
     gl.Color(1f, 1f, 1f);
     drawPar(1f, height, 1f);
     gl.Disable(OpenGL.GL_STENCIL_TEST);
 }


Результат попытки №1: 67536e3026a31234081886.jpeg
Полученная фигура лагает потому что грани фигуры лежат на грянях куба

Результат попытки №9380: 67536e70d5b6e339342367.jpeg
Фигура просвечивается с любой стороны куба
  • Вопрос задан
  • 45 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы