نمایش نتایج 1 تا 10 از 10

نام تاپیک: چنتا سوال در مورد opengl

  1. #1
    کاربر دائمی آواتار 1485159
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    NULL
    سن
    30
    پست
    886

    چنتا سوال در مورد opengl

    سلام
    در opengl در حالت 2 بعدی با این کد:
      glMatrixMode(GL_PROJECTION);
    glLoadIdentity;
    glViewport(0, 0, ClientWidth, ClientHeight);
    glOrtho(0,form1.ClientWidth,form1.ClientHeight,0);

    میشه هر واحد رو به یک پیکسل نسبت داد! ولی در حالت 3 بعدی نمیتونم!!!
    در ضمن با کد بالا در حالت 2 بعدی نقطه 0و0 میشه گوشه چپ و بالا ولی در حالت سه بعدی نمیشه!
    میشه یه راهنمایی کنید که 2 عمل بالا رو در حالت 3 بعدی هم برقرار کنم؟ زبانش مهم نیست شما به هر زبانی که دوس داری بنویس.
    :lol:
    ممنون.

  2. #2
    کاربر دائمی آواتار 1485159
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    NULL
    سن
    30
    پست
    886

    نقل قول: چنتا سوال در مورد opengl

    کسی چیزی نمیخواد بگه؟

  3. #3

    نقل قول: چنتا سوال در مورد opengl

    سلام

    من که دقیقا سوالت رو نفهمیدم ولی این کاری رو هم که می گی شدنی نیست و اینکه چه نیازی هم به این کار است رو نمی دونم
    Kochol Game Engine
    http://www.kge3d.org



  4. #4
    کاربر دائمی آواتار 1485159
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    NULL
    سن
    30
    پست
    886

    نقل قول: چنتا سوال در مورد opengl

    من که دقیقا سوالت رو نفهمیدم ولی این کاری رو هم که می گی شدنی نیست و اینکه چه نیازی هم به این کار است رو نمی دونم
    سلام
    بعد از 2 روز نا امیدی واقعا خوشحال شدم!!!! چرا؟ ببین کی جواب دادی؟
    منظورم اینه که توی حالت 3 بعدی من اگه بخوام یه مربع در مختصات 50 و 50 و 50 پیکسل رسم کنم، نمیتونم!!
    و یا مثلا با جابجا کردن موس مربع هم با موس حرکت کنه...
    ممنون.

  5. #5

    نقل قول: چنتا سوال در مورد opengl

    سلام
    الان سوالت خوب واضح شد.

    ببین برای این کار باید ray picking انجام بدی. چون ماوس روی یک محیط 2 بعدی حرکت می کند و محیط تو سه بعدی هست و پس وقتی که کلیک می کنی باید یک خط بسازی که از مکان دوربین تا ته صحنه باشه.

    بعد باید این خط رو با یک صفحه برخوردشو حساب کنی.

    این کدی هست که یک خط بر اساس ماتریس projection می سازه.

    void CalcPickingRay(int x, int y, sn::Camera* pCam)
    {
    Matrix m = pCam->GetProjectionMatrix();
    core::RectI vp = pCam->GetViewPort();
    float fx, fy;
    fx = (2.0f * x / vp.Width - 1.0f) / m.m_fMat[0];//(vp.Width / 2.0f);//
    fy = (-2.0f * y / vp.Height + 1.0f) / m.m_fMat[5];//(vp.Height / -2.0f);//

    Position.set(0.0f, 0.0f, 0.0f);
    Target.set(fx, fy, 1.0f);
    Direction.set(fx, fy, 1.0f);

    } // CalcPickingRay


    بعد ماتریس view رو می فرستی و این خط رو به فضای دوربین می بری.


    void TransformRayInverse(Matrix* mat)
    {
    mat->Inverse();
    mat->TranslateVec(Position);
    mat->RotateVec(Target);
    mat->TranslateVec(Target);
    Direction = Target - Position;
    Target = Target + (Direction * 2000.0f);
    Direction = Target - Position;

    } // TransformRayInverse



    این هم کدی هست که برخورد یک خط رو با یک مثلث حساب می کنه می تونی یه صفحه با دو تا مثلث بسازی و مکعبت رو بر روی ان صفحه با حرکت ماوس تکون بدی.

    من کد برخورد خط با صفحه رو ننوشتم و بلد هم نیستم ولی راحتتر و سریع تر از برخورد با یک مثلث هست.


    //! Checks if the ray and triangle intersects and store the intersection point in the Out parameter.
    CollisionType IntersectRay(Ray* pRay, kge::math::Vector& Out)
    {
    Edge1 = (*Point2) - (*Point1);
    Edge2 = (*Point3) - (*Point1);
    Normal.Cross(Edge1, Edge2);
    float fGama = -(pRay->Direction * Normal);

    if (fGama < fEpsilon)
    return ECT_NotIntersect;

    Vector b = pRay->Position - (*Point1);
    float fLanda = (b * Normal) / fGama;

    if (fLanda >= 0.0f && fLanda <= 1.0f)
    {
    Vector u;
    u.Cross(b, pRay->Direction);
    float u1, u2;
    u1 = (Edge2.ToVector() * u) / fGama;
    u2 = (-(Edge1.ToVector() * u)) / fGama;
    if (u1 + u2 <= 1.0f && u1 >= 0.0f && u2 >= 0.0f)
    {
    Out = pRay->Position + (pRay->Direction * fLanda);
    return ECT_Intersect;
    }
    }

    return ECT_NotIntersect;

    } // IntersectRay
    Kochol Game Engine
    http://www.kge3d.org



  6. #6
    کاربر دائمی آواتار 1485159
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    NULL
    سن
    30
    پست
    886

    نقل قول: چنتا سوال در مورد opengl

    نقل قول نوشته شده توسط kochol مشاهده تاپیک
    سلام
    الان سوالت خوب واضح شد.

    ببین برای این کار باید ray picking انجام بدی. چون ماوس روی یک محیط 2 بعدی حرکت می کند و محیط تو سه بعدی هست و پس وقتی که کلیک می کنی باید یک خط بسازی که از مکان دوربین تا ته صحنه باشه.

    بعد باید این خط رو با یک صفحه برخوردشو حساب کنی.

    این کدی هست که یک خط بر اساس ماتریس projection می سازه.

    void CalcPickingRay(int x, int y, sn::Camera* pCam)
    {
    Matrix m = pCam->GetProjectionMatrix();
    core::RectI vp = pCam->GetViewPort();
    float fx, fy;
    fx = (2.0f * x / vp.Width - 1.0f) / m.m_fMat[0];//(vp.Width / 2.0f);//
    fy = (-2.0f * y / vp.Height + 1.0f) / m.m_fMat[5];//(vp.Height / -2.0f);//

    Position.set(0.0f, 0.0f, 0.0f);
    Target.set(fx, fy, 1.0f);
    Direction.set(fx, fy, 1.0f);

    } // CalcPickingRay
    بعد ماتریس view رو می فرستی و این خط رو به فضای دوربین می بری.


    void TransformRayInverse(Matrix* mat)
    {
    mat->Inverse();
    mat->TranslateVec(Position);
    mat->RotateVec(Target);
    mat->TranslateVec(Target);
    Direction = Target - Position;
    Target = Target + (Direction * 2000.0f);
    Direction = Target - Position;

    } // TransformRayInverse

    این هم کدی هست که برخورد یک خط رو با یک مثلث حساب می کنه می تونی یه صفحه با دو تا مثلث بسازی و مکعبت رو بر روی ان صفحه با حرکت ماوس تکون بدی.

    من کد برخورد خط با صفحه رو ننوشتم و بلد هم نیستم ولی راحتتر و سریع تر از برخورد با یک مثلث هست.


    //! Checks if the ray and triangle intersects and store the intersection point in the Out parameter.
    CollisionType IntersectRay(Ray* pRay, kge::math::Vector& Out)
    {
    Edge1 = (*Point2) - (*Point1);
    Edge2 = (*Point3) - (*Point1);
    Normal.Cross(Edge1, Edge2);
    float fGama = -(pRay->Direction * Normal);

    if (fGama < fEpsilon)
    return ECT_NotIntersect;

    Vector b = pRay->Position - (*Point1);
    float fLanda = (b * Normal) / fGama;

    if (fLanda >= 0.0f && fLanda <= 1.0f)
    {
    Vector u;
    u.Cross(b, pRay->Direction);
    float u1, u2;
    u1 = (Edge2.ToVector() * u) / fGama;
    u2 = (-(Edge1.ToVector() * u)) / fGama;
    if (u1 + u2 <= 1.0f && u1 >= 0.0f && u2 >= 0.0f)
    {
    Out = pRay->Position + (pRay->Direction * fLanda);
    return ECT_Intersect;
    }
    }

    return ECT_NotIntersect;

    } // IntersectRay
    ممنون از جوابتون ولی من نفهمیدم!
    اگه شما لطف کنی کدی بزاری که از نقطه 0و0و0یه خط به نقطه 50و50و0 بکشه من خودم بقیشو مینویسم..
    ممنون.

  7. #7

    نقل قول: چنتا سوال در مورد opengl

    تو دیگه خیلی تنبلی اگه یه نگاهی به پارامتر های ورودی و خروجی بندازی می فهمی که چه طوری کار می کنه.
    Kochol Game Engine
    http://www.kge3d.org



  8. #8
    کاربر دائمی آواتار 1485159
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    NULL
    سن
    30
    پست
    886

    نقل قول: چنتا سوال در مورد opengl

    چطوری برای یک تسکچر bmp خاصیت TransparentColor رو به وجود بیارم؟
    ممنون.

  9. #9

    نقل قول: چنتا سوال در مورد opengl

    کاش برای این بخش هم یه مدیر بزارن

    این همه پست های چرت و پرت چیه میزنی

    تو هنوز نمی دونی هر تاپیک برای یه سوال است
    Kochol Game Engine
    http://www.kge3d.org



  10. #10
    کاربر دائمی آواتار 1485159
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    NULL
    سن
    30
    پست
    886

    نقل قول: چنتا سوال در مورد opengl

    کاش برای این بخش هم یه مدیر بزارن

    این همه پست های چرت و پرت چیه میزنی

    تو هنوز نمی دونی هر تاپیک برای یه سوال است
    بله حق با شماست!
    ممنون.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •