<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=140681&amp;view=findpost&amp;p=1086136</guid>
        <pubDate>Sat, 22 Apr 2006 15:44:23 +0000</pubDate>
        <title>OpenGL: выбор объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=140681&amp;view=findpost&amp;p=1086136</link>
        <description><![CDATA[Lo_ky: Добрый день&#33;<br>
Мне нужно выбирать объекты (при нажати кнопки мыши, должно выводится выбран объект или нет).<br>
Использую буфер выбора. Если обект не перемещать, все работает. <br>
Но если изменить начальное положение объекта (повернуть, сместить), объект смещается, а сообщение о том выбран объект или нет возвращает значение исходя из начального положнния объекта, т.е. как будто он не перемещался :( <br>
Помогите разобраться, что нужно добавить в код, чтобы работало корректно <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit frmMain;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Controls, SysUtils,</div><div class="code_line">&nbsp;&nbsp;Dialogs, StdCtrls,</div><div class="code_line">&nbsp;&nbsp;OpenGL;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TfrmGL = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Memo1: TMemo;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormCreate(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormResize(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormDestroy(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormMouseDown(Sender: TObject; Button: TMouseButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Shift: TShiftState; X, Y: Integer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormKeyDown(Sender: TObject; var Key: Word;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Shift: TShiftState);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;DC: HDC;</div><div class="code_line">&nbsp;&nbsp; &nbsp;hrc: HGLRC;</div><div class="code_line">&nbsp;&nbsp; &nbsp;vp : Array [0..3] of GLint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;selectBuf : Array [0..128] of GLuint;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure SetDCPixelFormat;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Render (mode : GLEnum);</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoSelect(x : GLint; y : GLint) : GLUInt;</div><div class="code_line">&nbsp;&nbsp;protected</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;frmGL: TfrmGL;</div><div class="code_line">&nbsp;&nbsp;angle : GLfloat = 0;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.DFM}</div><div class="code_line">&nbsp;</div><div class="code_line">procedure angleAdd;</div><div class="code_line">begin</div><div class="code_line">&nbsp;angle := angle + 0.05;</div><div class="code_line">&nbsp;if angle &#62; 1</div><div class="code_line">&nbsp;then angle := 0;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure angleSubtract;</div><div class="code_line">begin</div><div class="code_line">&nbsp;angle := angle - 0.05;</div><div class="code_line">&nbsp;if angle &#60; -1</div><div class="code_line">&nbsp;then angle := 0;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TfrmGL.DoSelect(x : GLint; y : GLint) : GLUInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;glRenderMode(GL_SELECT);</div><div class="code_line">&nbsp;&nbsp;glInitNames;</div><div class="code_line">&nbsp;&nbsp;glPushName(0);</div><div class="code_line">&nbsp;&nbsp;glGetIntegerv(GL_VIEWPORT, @vp);</div><div class="code_line">&nbsp;&nbsp;glMatrixMode(GL_PROJECTION);</div><div class="code_line">&nbsp;&nbsp;glLoadIdentity;</div><div class="code_line">&nbsp;&nbsp;gluPickMatrix(x, ClientHeight - y, 1, 1, @vp);</div><div class="code_line">&nbsp;&nbsp;gluPerspective(18.0, (ClientWidth - Memo1.Width) / ClientHeight, 6.0, 10.0);</div><div class="code_line">&nbsp;&nbsp;glViewport(0, 0, (ClientWidth - Memo1.Width), ClientHeight);</div><div class="code_line">&nbsp;&nbsp;glMatrixMode(GL_MODELVIEW);</div><div class="code_line">&nbsp;&nbsp;glClear(GL_COLOR_BUFFER_BIT);</div><div class="code_line">&nbsp;&nbsp;Render(GL_SELECT);</div><div class="code_line">&nbsp;&nbsp;Result := glRenderMode(GL_RENDER);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.Render (mode : GLEnum);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;glPushMatrix;</div><div class="code_line">&nbsp;&nbsp;glRotatef (-60, 0.0, 0.0, 1.0);</div><div class="code_line">&nbsp;&nbsp;if mode = GL_SELECT</div><div class="code_line">&nbsp;&nbsp;then glLoadName (0);</div><div class="code_line">&nbsp;&nbsp;glColor3f (1.0, 0.0, 0.0);</div><div class="code_line">&nbsp;&nbsp;glRectf(-0.5, -0.5, 0.5, 0.5);</div><div class="code_line">&nbsp;&nbsp;glPopMatrix;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.WMPaint(var Msg: TWMPaint);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;ps : TPaintStruct;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;BeginPaint(Handle, ps);</div><div class="code_line">&nbsp;&nbsp;glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);</div><div class="code_line">&nbsp;&nbsp;glLoadIdentity;</div><div class="code_line">&nbsp;&nbsp;glTranslatef(0.0, 0.0, -9.0);</div><div class="code_line">&nbsp;&nbsp;glRotatef(90.0, 1.0, 0.0, 1.0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;glPushMatrix;</div><div class="code_line">&nbsp;&nbsp;//glRotatef (angle, 0.0, 0.0, 1.0);</div><div class="code_line">&nbsp;&nbsp;glTranslatef(0.0, 0.0, angle);</div><div class="code_line">&nbsp;&nbsp;Render (GL_RENDER);</div><div class="code_line">&nbsp;&nbsp;glPopMatrix;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SwapBuffers(DC);</div><div class="code_line">&nbsp;&nbsp;EndPaint(Handle, ps);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;DC := GetDC(Handle);</div><div class="code_line">&nbsp;&nbsp;SetDCPixelFormat;</div><div class="code_line">&nbsp;&nbsp;hrc := wglCreateContext(DC);</div><div class="code_line">&nbsp;&nbsp;wglMakeCurrent(DC, hrc);</div><div class="code_line">&nbsp;&nbsp;glSelectBuffer(SizeOf (selectBuf), @selectBuf);</div><div class="code_line">&nbsp;&nbsp;Memo1.Clear;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.SetDCPixelFormat;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;nPixelFormat: Integer;</div><div class="code_line">&nbsp;&nbsp;pfd: TPixelFormatDescriptor;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FillChar(pfd, SizeOf(pfd), 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;pfd.dwFlags &nbsp; := PFD_DRAW_TO_WINDOW or</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PFD_SUPPORT_OPENGL or</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PFD_DOUBLEBUFFER;</div><div class="code_line">&nbsp;&nbsp;nPixelFormat := ChoosePixelFormat(DC, @pfd);</div><div class="code_line">&nbsp;&nbsp;SetPixelFormat(DC, nPixelFormat, @pfd);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.FormResize(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;glViewport(0, 0, (ClientWidth - Memo1.Width), ClientHeight);</div><div class="code_line">&nbsp;&nbsp;glMatrixMode(GL_PROJECTION);</div><div class="code_line">&nbsp;&nbsp;glLoadIdentity;</div><div class="code_line">&nbsp;&nbsp;gluPerspective(18.0, (ClientWidth - Memo1.Width) / ClientHeight, 6.0, 10.0);</div><div class="code_line">&nbsp;&nbsp;glMatrixMode(GL_MODELVIEW);</div><div class="code_line">&nbsp;&nbsp;glGetIntegerv(GL_VIEWPORT, @vp);</div><div class="code_line">&nbsp;&nbsp;InvalidateRect(Handle, nil, False);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.FormDestroy(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;wglMakeCurrent(0, 0);</div><div class="code_line">&nbsp;&nbsp;wglDeleteContext(hrc);</div><div class="code_line">&nbsp;&nbsp;ReleaseDC(Handle, DC);</div><div class="code_line">&nbsp;&nbsp;DeleteDC (DC);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.FormMouseDown(Sender: TObject; Button: TMouseButton;</div><div class="code_line">&nbsp;&nbsp;Shift: TShiftState; X, Y: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;hit, hits: GLUint;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;hits := DoSelect (X, Y);</div><div class="code_line">&nbsp;&nbsp;Memo1.Clear;</div><div class="code_line">&nbsp;&nbsp;Memo1.Lines.Add(Format(&#39;&#206;&#225;&#250;&#229;&#234;&#242;&#238;&#226; &#239;&#238;&#228; &#234;&#243;&#240;&#241;&#238;&#240;&#238;&#236; : %d&#39;,[hits]));</div><div class="code_line">&nbsp;&nbsp;glViewport(0, 0, (ClientWidth - Memo1.Width), ClientHeight);</div><div class="code_line">&nbsp;&nbsp;glMatrixMode(GL_PROJECTION);</div><div class="code_line">&nbsp;&nbsp;glLoadIdentity;</div><div class="code_line">&nbsp;&nbsp;gluPerspective(18.0, (ClientWidth - Memo1.Width) / ClientHeight, 6.0, 10.0);</div><div class="code_line">&nbsp;&nbsp;glGetIntegerv(GL_VIEWPORT, @vp);</div><div class="code_line">&nbsp;&nbsp;glMatrixMode(GL_MODELVIEW);</div><div class="code_line">&nbsp;&nbsp;InvalidateRect(Handle, nil, False);</div><div class="code_line">&nbsp;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;</div><div class="code_line">&nbsp;&nbsp;Shift: TShiftState);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;If Key = VK_ESCAPE then Close;</div><div class="code_line">&nbsp;&nbsp; If Key = VK_UP then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;angleSubtract;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InvalidateRect(Handle, nil, False);</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;If Key = VK_DOWN then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;angleAdd;</div><div class="code_line">&nbsp;&nbsp; InvalidateRect(Handle, nil, False);</div><div class="code_line">&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Lo_ky</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	