سؤال
لقد كتبت رمزًا يولد شعاعًا من "عين" الكاميرا إلى طائرة المشاهدة على بعد مسافة بعيدة عن عين الكاميرا:
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
الزوايا صغيرة لن تحدث فرقًا كبيرًا.