سؤال

لقد كتبت رمزًا يولد شعاعًا من "عين" الكاميرا إلى طائرة المشاهدة على بعد مسافة بعيدة عن عين الكاميرا:

R3Ray ConstructRayThroughPixel(...)
{
  R3Point p;

  double increments_x = (lr.X() - ul.X())/(double)width;
  double increments_y = (ul.Y() - lr.Y())/(double)height;
  p.SetX( ul.X() + ((double)i_pos+0.5)*increments_x );
  p.SetY( lr.Y() + ((double)j_pos+0.5)*increments_y );
  p.SetZ( lr.Z() );

  R3Vector v = p-camera_pos;

  R3Ray new_ray(camera_pos,v);
  return new_ray;
}

ul هو الركن الأيسر العلوي من مستوى المشاهدة و lr هو الركن الأيسر السفلي من مستوى المشاهدة. يتم تعريفها على النحو التالي:

  R3Point org = scene->camera.eye + scene->camera.towards * radius;
  R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
  R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);
  R3Point lr = org + dx - dy;
  R3Point ul = org - dx + dy;

هنا، org هو مركز طائرة المشاهدة مع radius كونه المسافة بين طائرة المشاهدة وعين الكاميرا ، dx و dy هي النزوح في اتجاهات x و y من مركز طائرة المشاهدة.

ال ConstructRayThroughPixel(...) تعمل الوظيفة تمامًا للكاميرا التي تكون عينها في (0،0،0). ومع ذلك ، عندما تكون الكاميرا في وضع مختلف ، لا يتم إنتاج جميع الأشعة اللازمة للصورة.

أي اقتراحات ما الذي يمكن أن يحدث خطأ؟ ربما شيء خاطئ في معادلاتي؟

شكرا للمساعدة.

هل كانت مفيدة؟

المحلول 2

السبب وراء عدم عمل الكود الخاص بي هو أنني كنت أتعامل مع قيم X و Y و Z بشكل منفصل. هذا خطأ ، لأن الكاميرا يمكن أن تواجه في أي اتجاه ، وبالتالي إذا كانت تواجه المحور السيني ، فإن الإحداثيات X ستكون هي نفسها ، وتنتج increments من 0 (وهو غير صحيح). بدلاً من ذلك ، ما يجب القيام به هو استيفاء من نقاط الزاوية (حيث تحتوي النقاط على إحداثيات X و Y و Z). يرجى الاطلاع على الإجابة في المنشور ذي الصلة: إحداثيات ثلاثية الأبعاد من نقطة ثنائية الأبعاد معطى الكاميرا وعرض الطائرة

نصائح أخرى

إليك مشكلة قد لا علاقة لها بها:

عندما تفعل هذا:

R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);

أفترض أن right و up المتجهات تطبيع ، أليس كذلك؟ في هذه الحالة تريد sin ليس tan. بالطبع ، إذا fov الزوايا صغيرة لن تحدث فرقًا كبيرًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top