none
Изменение яркости объектов RRS feed

  • Вопрос

  • Почему при сжатии или растяжении объекта с помощью матрицы  Scaling меняется яркость? Как этого избежать?

    Например, три раза выводим чайник нормальный, уменьшенный (яркость увеличилась), увеличенный  (яркость уменьшилась).

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    
    namespace l003
    {
        public partial class Form1 : Form
        {
            float ar = 4f / 3f;
            Color bc = Color.Gray;
            Device dr;
            PresentParameters ppr = new PresentParameters();
            Mesh myp;
            Material matmyp;
            Vector3 cp = new Vector3(10, 0, 0), ct = new Vector3(0, 0, 0), cup = new Vector3(0, 0, 1);
            public Form1()
            {
                InitializeComponent();
                this.ClientSize = new Size(800, 600);
            }
    
            //Инициализация 3D устройства
            public bool InitializeGraphics()
            {
                try
                {
                    ppr.Windowed = true;
                    ppr.SwapEffect = SwapEffect.Discard;
                    ppr.EnableAutoDepthStencil = true;
                    ppr.AutoDepthStencilFormat = DepthFormat.D24S8;
                    try
                    {
                        dr = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, ppr);
                    }
                    catch
                    {
                        dr = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, ppr);
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    
            //Загрузка формы
            private void Form1_Load(object sender, EventArgs e)
            {
                if (!this.InitializeGraphics())
                {
                    MessageBox.Show("Невозможно инициализировать Direct3D устройство. Программа будет закрыта.");
                    this.Close();
                }
                myp = Mesh.Teapot(dr);
                matmyp.Diffuse = Color.Red;
                timer1.Enabled = true;
            }
    
            //Вывод по таймеру
            private void timer1_Tick(object sender, EventArgs e)
            {
                try
                {
                    dr.BeginScene();
                    dr.RenderState.CullMode = Cull.None;
                    dr.RenderState.ZBufferEnable = true;
                    dr.Lights[0].Type = LightType.Directional;
                    dr.Lights[0].Diffuse = System.Drawing.Color.White;
                    dr.Lights[0].Direction = -cp;
                    dr.Lights[0].Enabled = true;
                    dr.Clear(ClearFlags.ZBuffer | ClearFlags.Target, bc, 1f, 0);
                    dr.Transform.View = Matrix.LookAtRH(cp, ct, cup);
                    dr.Transform.Projection = Matrix.PerspectiveFovRH((float)Math.PI / 4f, ar, 1f, 200f);
    
                    dr.Material = matmyp;
                    //Нормальный объект
                    dr.Transform.World = Matrix.RotationX((float)Math.PI / 2f) * Matrix.Scaling(1, 1, 1) * Matrix.Translation(0, 0, 0);
                    myp.DrawSubset(0);
                    //Уменьшенный объект
                    dr.Transform.World = Matrix.RotationX((float)Math.PI / 2f) * Matrix.Scaling(.5f, .5f, .5f) * Matrix.Translation(0, -3, 0);
                    myp.DrawSubset(0);
                    //Увеличенный объект
                    dr.Transform.World = Matrix.RotationX((float)Math.PI / 2f) * Matrix.Scaling(2, 2, 2) * Matrix.Translation(0, 3, 0) ;
                    myp.DrawSubset(0);
    
                    dr.EndScene();
                    dr.Present();
                }
                catch
                {
                    this.Close();
                }
            }
        }
    }
    
    

     

    • Изменено hellokol 1 октября 2011 г. 9:23
    • Перемещено Abolmasov Dmitry 3 октября 2011 г. 10:19 (От:Игры)
    1 октября 2011 г. 9:12

Ответы

  • Все логично. Когда вы увеличиваете чайник в 2 раза, нормали по-умолчанию увеличиваются в 2 раза - чайник темнеет. Наоборот, когда вы уменьшаете чайник в 2 раза, то укорачиваете нормали - чайник светлеет.

    Необходимо добавить автоматическую нормализацию нормалей. Для этого сделайте следующее:

     

    dr.RenderState.NormalizeNormals = true;
    
    • Изменено Skimin0k 3 октября 2011 г. 18:17
    • Помечено в качестве ответа hellokol 3 октября 2011 г. 18:37
    3 октября 2011 г. 18:10

Все ответы

  • Скорее всего яркость объектов одинаковая, просто ваш направленный источник света светит в сторону маленького чайника. Попробуйте поменять направление, или переставить чайники.
    • Помечено в качестве ответа Abolmasov Dmitry 3 октября 2011 г. 10:40
    • Снята пометка об ответе hellokol 3 октября 2011 г. 11:26
    3 октября 2011 г. 8:41
  • Источник света светит параллельными лучами, и яркость не зависит от положения объекта.

    		dr.Lights[0].Type = LightType.Directional;
                    dr.Lights[0].Diffuse = System.Drawing.Color.White;
                    dr.Lights[0].Direction = -cp;
                     dr.Lights[0].Enabled = true;
    
    
    Яркость уменьшается при увеличении объекта. Если не верите, могу прислать проект.

    3 октября 2011 г. 11:51
  • Все логично. Когда вы увеличиваете чайник в 2 раза, нормали по-умолчанию увеличиваются в 2 раза - чайник темнеет. Наоборот, когда вы уменьшаете чайник в 2 раза, то укорачиваете нормали - чайник светлеет.

    Необходимо добавить автоматическую нормализацию нормалей. Для этого сделайте следующее:

     

    dr.RenderState.NormalizeNormals = true;
    
    • Изменено Skimin0k 3 октября 2011 г. 18:17
    • Помечено в качестве ответа hellokol 3 октября 2011 г. 18:37
    3 октября 2011 г. 18:10
  • Спасибо!

    3 октября 2011 г. 18:39