Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 11

Chủ đề: Chuột trong OpenGL?

  1. #1
    Tham gia
    24-07-2002
    Bài viết
    202
    Like
    0
    Thanked 0 Times in 0 Posts

    Câu hỏi, cần giúp đỡ Chuột trong OpenGL?

    Bác nào chỉ cho em cách xài chuột trong OpenGL được không (khởi tạo, làm sao để bắt sự kiện bấm chuột, tọa độ thời điểm bấm,Object nào được chuột nhấn vào?) Em đọc trong Nehe chỉ toàn keys không có thấy mouse.
    Quote Quote

  2. #2
    Tham gia
    17-09-2002
    Location
    SMA
    Bài viết
    749
    Like
    0
    Thanked 3 Times in 3 Posts
    bác đã đọc hết nehe chưa mà phán vậy. Một là chuột với OGL ko có bà con gì hết, hai là có khá nhiều tut của nehe xài chuột. Bác chưa gì mà la um lên rồi.

  3. #3
    Tham gia
    21-11-2002
    Location
    Hồ Chí Minh
    Bài viết
    3,422
    Like
    17
    Thanked 206 Times in 121 Posts
    anh march2 nóng qua',em no' mới hỏi 1 tí mà anh march giận rồi T.T .lâu lâu mới thấy march tái xuất giang hồ

  4. #4
    Tham gia
    24-07-2002
    Bài viết
    202
    Like
    0
    Thanked 0 Times in 0 Posts
    Ê ngocquang, tôi bằng tuổi ông đấy, xie xie vì đã binh tui nha! ^_^
    Mach2 ơi! Trong nehe chỉ có phần chuột di theo hướng nào thôi, còn lấy tọa độ điểm nhấn chuột thì mình chưa biết, với lại làm sao để biết được object nào được nhấn mình cũng kô thấy trong đó nói. Giả sử mình có bàn cờ 64 ô, làm sao để biết ô nào được nhấn, phải vẽ 64 ô tương đương 64 object à,ngày xưa làm đánh cờ trên dos (2D) thì mình dùng cách xác định tọa độ điểm nhấn chuột để => số ô. nhưng tọa độ nhấn chuột trong 3D thì lúc quay góc đi biết tính ra sao.
    Ai giúp mình với, mình đang kẹt phần đó!

  5. #5
    Tham gia
    17-09-2002
    Location
    SMA
    Bài viết
    749
    Like
    0
    Thanked 3 Times in 3 Posts
    2 cái bạn cần là khác nhau. Bắt tọa độ thì như bình thường thôi, bắt tọa độ điểm rồi tính ngược ra tọa độ 3d bằng glUnProject hay dễ nhất như bạn cần là chỉ dùng phép chiếu Ortho để việc tính ngược đơn giản hơn. Picking thì có hắn 1 tut trên nehe bàn chuyện này. Cần nói thêm là 2 cái này đều xem như kỹ thuật advance cả nên nếu bạn chưa rành OGL thì cần tìm hiểu thêm trước khi rờ đến nó.

  6. #6
    Tham gia
    24-07-2002
    Bài viết
    202
    Like
    0
    Thanked 0 Times in 0 Posts
    Thế với phần mềm đánh cờ, làm sao để biết được ô nào được nhấn (di) chuột vào hả bác Mach2!

  7. #7
    Tham gia
    17-09-2002
    Location
    SMA
    Bài viết
    749
    Like
    0
    Thanked 3 Times in 3 Posts
    Nếu bạn cần bắt object trong 3D "thật" thì phải dùng picking rồi. Dễ nhất là đọc tut 32 của nehe (cái này thì như tôi đã nói là khá rối rắm nếu bạn chưa rành OGL). Hoặc là đọc trong OpenGL Superbible viết cũng được. Quyển này thì chắc là bạn phải có, còn nếu ko có thì kiếm cũng dễ.

  8. #8
    Tham gia
    24-07-2002
    Bài viết
    202
    Like
    0
    Thanked 0 Times in 0 Posts
    dạ, cảm ơn bác nhé, cái tut này đúng là cái em đang cần! Còn sách thì em tìm vẫn chưa ra bác ạ! Bác có không cho em với!

  9. #9
    Tham gia
    28-12-2002
    Location
    ha noi
    Bài viết
    125
    Like
    0
    Thanked 2 Times in 2 Posts
    Chuột là sự kiện của window , khi bạn khởi tạo 1 form thì có sự kiện chuột bàn phím ...
    ở trong cái WndProc (hàm call back của window ) . Còn picking ra sao thi tùy vào phần xử lý của bạn theo hướng nào (RayCaster , ObjID picking , hay bitmap .. ) .

  10. #10
    Tham gia
    28-12-2002
    Location
    ha noi
    Bài viết
    125
    Like
    0
    Thanked 2 Times in 2 Posts
    1 số tút các bạn tham khảo về sự kiện và khởi tạo window. có gì thắc mắc hay càu nhàu thì tính sau. dân amater nên viết hơi khó hiểu .(hehe)

    unit GXsystem ;

    interface
    {Define FPS_AUTO_BLANCE}


    uses windows ,
    Opengl ,
    Messages ,
    Sysutils ,
    GXTypes ,
    KeyBoard ,
    GxVectorTypes;




    var
    SYS_KEYPRESS : Boolean ;
    SYS_KEYDOWN : Boolean ;
    SYS_KEYUP : Boolean ;
    SYS_MOUSEUP : Boolean ;
    SYS_MOUSEDOWN : BOOLEAN ;
    SYS_MOUSEWHEEL : BOOLEAN ;
    KeyList : Set of Byte = [] ;

    MOUSEBUTTONs : SET of TXMOUSEBUTTONTAG ;



    MOUSEWHEEL : Integer ;
    MOUSELEFT
    ,MOUSERIGHT
    ,MOUSEMIDdle : Boolean;
    MOUSEMOVE : Boolean;

    MouseOffX : integer;
    MouseOffY : Integer;
    //------------------------------------------------------------------------------
    SYS_Viewer : Tvector3f;
    //------------------------------------------------------------------------------
    SYS_MSG : INteger ;
    SYS_WPARAM : WPARAM ;
    SYS_LPARAM : LPARAM ;

    SYS_SPF : integer=0 ;
    SYS_FPS : integer=100;
    SYS_FCount : integer=0;
    Sys_FPS_String : String;
    Sys_StartTime : Cardinal =0;
    Sys_EndTime : Cardinal =0;
    Sys_ElappedTime : Cardinal =0;
    SYS_DeltaTime : Cardinal =0;
    SYS_INTERVAL : Integer =1000;
    SYS_TIMEInterval : Integer =0;
    //------------------------------------------------------------------------------
    H_wnd : Hwnd = 0 ;
    H_dc : Hdc = 0 ;
    H_Rc : HglRc = 0 ;
    ScrWidth : Integer = 800;
    ScrHeight : integer = 600;
    ScrBits : integer = 32;
    Full_screen : boolean = False ;
    SCr_Othor_Swap : Boolean = False ;
    //------------------------------------------------------------------------------
    DesktopRect : Trect;
    //------------------------------------------------------------------------------
    Mou*** ,MouseY : Integer;
    SYS_MLeftTime : Integer =0;
    SYS_MLeftOldTime : Integer =0;
    SYS_MRightTime : Integer =0;
    SYS_MRightOldTime : Integer =0;
    SYS_MLeftLastTime : Integer =0;
    SYS_MRightLastTime : Integer =0;

    SYS_MTimeMin : Cardinal = 250;
    SYS_MouseLOCk : Boolean = false;
    SYS_MouseLOckX : Integer = 0;
    SYS_MouseLockY : Integer = 0;
    MOusePoint : Tpoint;
    SYS_Char_Buffer : String;

    //------------------------------------------------------------------------------
    Procedure TIMERESET;
    Procedure TIMEACTIVATE;
    Function TIMEStatus : TXTimeTag;
    //------------------------------------------------------------------------------
    Function KeyNameToCode (name : string ) : Integer;
    Function KeyCOdeToName (Code : Integer) : String;
    Function KeyDown (Kname : string ) : Boolean ;Overload;
    Function KeyDown (VK : Integer ) : Boolean ;Overload;
    Function keyUp (Vk : Integer ) : Boolean ;overload;
    Function keyup (Vk : String ) : Boolean ;Overload;
    Function keyPress (Vk : Integer ) : Boolean ;Overload;
    Function keyPress (Vk : String ) : Boolean ;Overload;
    Function KeyStatus (VK : Integer ) : TStatusTag;
    Function KeyCode : Integer;
    Function KeyChar : TXChar;
    Function KeyMultiDown (K1 ,K2 : string ) : Boolean; Overload;
    Function KeyMultiDown (K1 ,K2,K3 : string ) : Boolean; Overload;
    Function KeyMultiDown (Keys : Array Of string ) : Boolean; Overload;

    Function KeyTest (key : Integer ; T : TXkeyStatusTag ) : Boolean; Overload;
    Function keytest (key : String ; T : TXkeyStatusTag ) : Boolean ; Overload;
    //------------------------------------------------------------------------------
    Procedure KeyUpdate ;
    Procedure KeyReset ;
    //------------------------------------------------------------------------------
    Procedure MouseUpdate ;
    Procedure Mousereset ;
    //------------------------------------------------------------------------------


    Function MLeftPress : Boolean;
    Function MRightPress : Boolean;
    //------------------------------------------------------------------------------

    Function MLeftDown : Boolean;
    Function MRightDown : Boolean;
    //------------------------------------------------------------------------------

    Function MLeftUp : Boolean;
    Function MRightUp : Boolean;
    //------------------------------------------------------------------------------

    Function MleftTimeElapped : cardinal;
    Function MRightTimeElapped : cardinal;
    //------------------------------------------------------------------------------

    Function MleftTime2Click : cardinal;
    Function MRightTime2Click : cardinal;
    //------------------------------------------------------------------------------

    Function MLeft2Click : Boolean;
    Function MRiGht2Click : Boolean;
    //------------------------------------------------------------------------------
    Function MouseIsMoveP (X : integer =0;Y : Integer =0) : TmousePoints;Overload;
    Function MouseIsMove (X : integer =0;Y : Integer =0) : TmouseMoves;Overload;
    PRocedure MouseLockPosition (X, y : integer ;Locked : Boolean);
    //------------------------------------------------------------------------------
    Function Getdesktoprect : Trect;
    function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;


    Procedure StringOK (Mess1 : String ;Titl : string );
    Procedure IntegerOK (Mess1 : Integer ;Titl : string );
    Procedure SingleOK (Mess1 : Single ;Titl : string );
    //------------------------------------------------------------------------------
    Function SYSGetFps : Integer;
    Function SYSGetFpsString : string ;

    //------------------------------------------------------------------------------

    implementation

    //------------------------------------------------------------------------------

    Procedure StringOK (Mess1 : String ;titl : string );
    begin
    Messagebox (0, Pchar(Titl),Pchar(mess1),Mb_ok);
    End;

    //------------------------------------------------------------------------------

    Procedure INtegerOK (Mess1 : Integer ;titl : string );
    begin
    Messagebox (0, Pchar(Titl),Pchar(Format('%d',[mess1])),Mb_ok);
    End;

    //------------------------------------------------------------------------------

    Procedure SingleOK (Mess1 : Single ;titl : string );
    begin
    Messagebox (0, Pchar(Titl),Pchar(Format('%.2f',[mess1])),Mb_ok);
    End;

    //------------------------------------------------------------------------------
    procedure MouseUpdate;
    begin

    Windows.GetCursorPos(Mousepoint) ;
    Mou*** := mousepoint.X ;
    If Scr_othor_Swap then
    mousey := ScrHeight - mousepoint.Y Else
    mousey := mousepoint.Y ;
    IF SYS_MouseLOck then
    setcursorPos (SYS_MouseLockx ,SYS_mouseLockY);


    Case SYS_MSG Of
    Wm_LBUttonDOWN : begin
    SYS_MOUSEDOWN := True ;
    MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSELEFT] ;
    MOUSELEFT := TRUE;
    SYS_MLeftTime := GettickCount()-SYS_MLeftOLdTime;
    SYS_MLeftOLdTime := GettickCount();

    End;
    Wm_RBUttonDown : begin
    SYS_MOUSEDOWN := True ;
    MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSERIGHT] ;
    MOUSERIGHT := TRUE;
    SYS_MRightTime := GettickCount()- SYS_MrightOldTime;
    SYS_MRightOLdTime := GetTickCount();

    End;
    Wm_LButtonUp : begin
    SYS_MOUSEUp := True ;
    MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSELEFT] ;
    MOUSELEFT := FALSE;
    SYS_MLeftLastTime := GetTickCount-SYS_MLeftOLDTime;

    End;
    Wm_RButtonUp : Begin
    SYS_MOUSEUp := True ;
    MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSERIGHT] ;
    MOUSERIGHT := FALSE;
    SYS_MRightLastTime := GettickCount;

    End;
    Wm_MButtonDown : begin
    SYS_MOUSEDOWN := True ;
    MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSEMIDDLE] ;
    MouseMiddle := true ;

    End;
    Wm_MButtonUp : Begin
    SYS_MOUSEUP := True ;
    MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSEMIDDLE] ;
    MouseMiddle := False ;

    End;
    Wm_MOUSEWHEEL : Begin
    SYS_MOUSEWHEEL := TRUE ;
    MOUSEWHEEL := SYS_WPARAM;
    End;

    End;
    End;

    //------------------------------------------------------------------------------
    PRocedure MouseReset ;
    Begin
    SYS_MLeftTime := 0;
    SYS_MRightTime := 0;
    SYS_MOUSEWHEEL := False;
    SYS_MOUSEDOWN := FALSE;
    SYS_MOUSEUP := FALSE;
    MOUSEWHEEL := 0;
    MOUSEBUTTONS := [] ;
    End;

    //------------------------------------------------------------------------------
    Procedure KeyUpdate ;
    Begin
    Case SYS_MSG Of
    WM_KeyDOWN : Begin
    SYS_KeyDown := True ;
    KeyList := KeyList+[SYS_WPARAM] ;
    End;
    Wm_KeyUp : Begin
    SYS_KeyUp := True ;
    KeyList := KeyList+[SYS_WPARAM] ;
    End;
    Wm_Char : begin
    SYS_KeyPress := true ;
    SYS_Char_Buffer := Char(SYS_WPARAM);
    eND;
    End;
    End;

    //------------------------------------------------------------------------------
    Procedure keyReset;
    Begin
    KeyList := [];
    SYS_CHAR_BUFFER := '';
    SYS_KeyDOWN := False;
    SYS_KeyUp := False;
    SYS_keyPress := False;
    End;

    //------------------------------------------------------------------------------

    Function Getdesktoprect : Trect;
    var HDesk : Hwnd;
    begin
    Hdesk := windows.GetDesktopWindow ;
    Windows.GetWindowRect(Hdesk , result) ;
    End;
    //------------------------------------------------------------------------------

    function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    Begin
    SYS_MSG := Msg;
    SYS_WPARAM := WPARAM ;
    SYS_LPARAM := LPARAM ;

    KeyUpdate;
    MOUSEUpdate;

    // SYS_Char_Buffer := '';
    //........................................
    case (Msg) of
    //........................................
    WM_CREATE:
    begin
    SYS_StartTime := GettickCount;
    end;
    WM_LbuttonDown : begin
    End;
    WM_LbuttonUp : Begin
    End;
    //........................................
    WM_RbuttonDown : Begin
    End;
    //........................................

    WM_RbuttonUp : Begin
    End;
    Wm_MButtonDown :
    begin
    End;
    Wm_MButtonUp :
    begin
    MouseMiddle := False ;
    End;
    //........................................

    WM_CLOSE:
    begin
    PostQuitMessage(0);
    end;
    else
    Result := DefWindowProc(hWnd, Msg, wParam, lParam); // Default result if nothing happens
    end;
    //........................................
    end;

    //------------------------------------------------------------------------------


    Function KeyNameToCode (name : string ) : Integer;
    begin
    Result := KeyBoard.KeyNameToVirtualKeyCode(Name);
    End;

    //------------------------------------------------------------------------------
    Function KeyCOdeToName (Code : Integer) : String;
    begin
    Result := keyboard.VirtualKeyCodeToKeyName( Code ) ;
    End;

    //------------------------------------------------------------------------------
    Function KeyDown (Kname : string ) : Boolean;
    begin
    result := IskeyDown (KeyNameToCode(Kname));
    End;
    //------------------------------------------------------------------------------

    Function KeyDown (VK : Integer ) : Boolean;
    Begin
    Result := ISkeyDown (Vk);
    End;
    //------------------------------------------------------------------------------
    Function keyStatus (Vk : Integer ) : TStatusTag ;
    Begin
    If keyDown (Vk) then Result := Result+[X_keyDown ] ;
    If keyUp (Vk) then Result := Result+[X_keyUp ] ;
    If keypress (Vk) then Result := Result+[X_keyPress ] ;
    End;
    //------------------------------------------------------------------------------
    Function KeyCode : Integer;
    begin
    result := 0;
    If Length(SYS_Char_Buffer)>0 then
    Result := ORD(SYS_Char_BUFFER[1]);
    End;

    //------------------------------------------------------------------------------
    Function KeyChar : TXChar;
    begin
    Result := SYS_CHAR_BUFFER ;
    End;
    //------------------------------------------------------------------------------------------------------------------

    Function KeyMultiDown (K1 ,K2 : string ) : Boolean;
    begin
    result := False;
    If (KeyDown (k1))
    And
    (KeyDown (k2))
    Then
    result := true;
    End;
    //------------------------------------------------------------------------------------------------------------------
    Function KeyMultiDown (K1 ,K2,K3 : string ) : Boolean; Overload;
    Begin
    result := False;
    If (KeyDown (k1))
    And
    (Keydown (k2))
    And
    (keydown (k3))
    then
    result := true ;
    End;

    //------------------------------------------------------------------------------------------------------------------

    Function KeyMultiDown (Keys : Array Of string ) : Boolean;
    var
    T : Boolean;
    i : Integer;
    begin
    result := False;
    T := Keydown (Keys[0]);
    For i:=1 to High (Keys) do
    T := T And keyDown(KEys[i]) ;
    result := T;
    End;

    //------------------------------------------------------------------------------------------------------------------
    Function MLeftPress : Boolean;
    begin
    Result := (SYS_MOUSEDOWN)And (X_MOUSELEFT in MOUSEBUTTONS);
    End;
    //------------------------------------------------------------------------------------------------------------------
    Function MRightPress : Boolean;
    Begin
    Result := (SYS_MOUSEDOWN)And (X_MOUSERIGHT in MOUSEBUTTONS);
    End;
    //---------------------------------------------------------------------------------

    //-------------------------------
    Function MLeftDown : Boolean;
    Begin
    result := keyboard.IsKeyDown(VK_Lbutton);
    End;
    //------------------------------------------------------------------------------------------------------------------
    Function MRightDown : Boolean;
    begin
    result := keyboard.IsKeyDown(VK_Rbutton);
    End;
    //------------------------------------------------------------------------------------------------------------------
    Function MLeftUp : Boolean;
    begin
    Result := (SYS_MOUSEUP)And (X_MOUSERIGHT in MOUSEBUTTONS);
    End;
    //------------------------------------------------------------------------------------------------------------------
    Function MRightUp : Boolean;
    begin
    Result := (SYS_MOUSEUP)And (X_MOUSERIGHT in MOUSEBUTTONS);
    End;


    //------------------------------------------------------------------------------------------------------------------
    PRocedure MouseLockPosition (X, y : integer;Locked : Boolean );
    Begin
    SYS_MouseLOck := Locked;
    SYS_MouseLockX := X;
    SYS_MouseLockY := Y;
    End;
    //------------------------------------------------------------------------------------------------------------------

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •