Graphics/DirectX

Direct X - 16. X, Y, Z 좌표 그려넣기

MOLOKINI 2014. 6. 9. 00:27

정말별거없다

X, Y, Z좌표에 선하나긋는 것 



using System;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.Windows.Forms;
using System.Drawing;

namespace MDXSample
{
    /// <summary>
    /// 메인 샘플 클래스
    /// </summary>
    public partial class MainSample : IDisposable
    {
        /// <summary>
        /// 정점 버퍼
        /// </summary>

        private VertexBuffer _xyzLineBuffer = null;

        public bool InitializeApplication(MainForm topLevelForm)
        {
            // 폼의 참조를 보관 유지
            this._form = topLevelForm;

            PresentParameters pp = new PresentParameters();
            pp.Windowed = true;
            pp.SwapEffect = SwapEffect.Discard;
            pp.EnableAutoDepthStencil = true;
            pp.AutoDepthStencilFormat = DepthFormat.D16;

            topLevelForm.MouseMove += new MouseEventHandler(this.form_MouseMove);

            try
            {
                // Direct3D 디바이스 작성
                this.CreateDevice(topLevelForm, pp);
                // 폰트의 작성
                this.CreateFont();

            }
            catch (DirectXException ex)
            {
                // 예외 발생
                MessageBox.Show(ex.ToString(), "에러", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            LoadXfile("01.x");  // 라이트까지 세팅되어있다.

            this._xyzLineBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 6, this._device,
                Usage.None, CustomVertex.PositionColored.Format, Pool.Managed);

            using (GraphicsStream data = this._xyzLineBuffer.Lock(0, 0, LockFlags.None))
            {
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 0.0f, Color.Red.ToArgb()));
                data.Write(new CustomVertex.PositionColored(10.0f, 0.0f, 0.0f, Color.Red.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 0.0f, Color.Green.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 15.0f, 0.0f, Color.Green.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 0.0f, Color.Black.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 10.0f, Color.Black.ToArgb()));

                this._xyzLineBuffer.Unlock();

            }

            return true;
        }

        /// <summary>
        /// 메인 루프 처리
        /// </summary>
        public void MainLoop()
        {       
            this.SettingCamera();
                        
            // 화면을 단색(파랑색)으로 클리어
            this._device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkBlue, 1.0f, 0);

            // 「BeginScene」와「EndScene」의 사이에 화면에 출력할 내용을 코딩
            this._device.BeginScene();

            this._device.RenderState.Lighting = false;

            this._device.SetStreamSource(0, this._xyzLineBuffer, 0);
            this._device.VertexFormat = CustomVertex.PositionColored.Format;
            this._device.DrawPrimitives(PrimitiveType.LineList, 0, 3);

            this._device.RenderState.Lighting = true;

            this.RenderMesh();            

            this._font.DrawText(null, "θ:" + this._lensPosTheta, 0, 0, Color.White);
            this._font.DrawText(null, "φ:" + this._lensPosPhi, 0, 12, Color.White);
            this._font.DrawText(null, "마우스 위치:" + this._oldMousePoint, 0, 24, Color.White);
            
            // 화면출력은 여기까지
            this._device.EndScene();

            // 실제의 디스플레이에 출력
            this._device.Present();
        }

        private void form_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this._lensPosTheta -= e.Location.X - this._oldMousePoint.X;
                this._lensPosPhi += e.Location.Y - this._oldMousePoint.Y;
            }
            this._oldMousePoint = e.Location;
        }

        /// <summary>
        /// 자원의 파기
        /// </summary>
        public void Dispose()
        {
            if (this._textures != null)
            {
                foreach (Texture i in this._textures)
                {
                    if (i != null)
                    {
                        i.Dispose();
                    }
                }
            }

            if (this._mesh != null)
            {
                this._mesh.Dispose();
            }

            // 폰트 자원을 해제
            if (this._font != null)
            {
                this._font.Dispose();
            }

            // Direct3D 디바이스의 자원 해제
            if (this._device != null)
            {
                this._device.Dispose();
            }
        }
    }
}


        private VertexBuffer _xyzLineBuffer = null;
왜 버텍스버퍼를 설정했는지.. 정점버퍼를 선언하는지 감이 이제 좀 오시죠?
다각형 그릴때 썼던거지만 선도 그릴 수 있다, 선을 그릴거니까 설정한 것


            this._xyzLineBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 6, this._device,
                Usage.None, CustomVertex.PositionColored.Format, Pool.Managed);
정점정보를 쓰는 것, 다른 속성들은 그렇다 치는데, 여기서 왜 정점정보가 6개일까
선이 세개, 그럼 선 한개당 정점은 양끝에 두개들어가기때문


            using (GraphicsStream data = this._xyzLineBuffer.Lock(0, 0, LockFlags.None))
            {
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 0.0f, Color.Red.ToArgb()));
                data.Write(new CustomVertex.PositionColored(10.0f, 0.0f, 0.0f, Color.Red.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 0.0f, Color.Green.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 15.0f, 0.0f, Color.Green.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 0.0f, Color.Black.ToArgb()));
                data.Write(new CustomVertex.PositionColored(0.0f, 0.0f, 10.0f, Color.Black.ToArgb()));

                this._xyzLineBuffer.Unlock();

            }
선은 각 방향에 10씩 연장해서 그렷는데, Y좌표가 잘 안보이길래 15연장했다
X에는 빨간색, Y는 초록색, Z는 검정색


            this._device.RenderState.Lighting = false;

            this._device.SetStreamSource(0, this._xyzLineBuffer, 0);
            this._device.VertexFormat = CustomVertex.PositionColored.Format;
            this._device.DrawPrimitives(PrimitiveType.LineList, 0, 3);

            this._device.RenderState.Lighting = true;
메인루프에서의 라인그리기
기본적으로 다각형 그리기와는 크게 차이는 없다
원시적 타입으로 선을 그리는 LineList 타입을 썼다
주의해야하는건, 라인의 정점 데이터에는 법선이 없어서 선을 그리기 전에 라이트를 끄고 그렸다
그리고 메쉬를 그리기 전에 라이트를 다시 켜놓은 것!
저 마지막줄 다음에는 메쉬를 그리기 때문^^

 JPG로하니까 선 색이 안보인다

여튼 저게 XYZ를 표시한 선