[英]simple way to determine what object a mouse is pointed over? (OpenGL, freeglut, c++)
我知道如何根據鼠標是否被單擊或釋放以及鼠標是否處於運動中或被單擊並處於運動中來進行操作(全部使用freeglut)。
但是google讓我感到非常壓力,我在選擇哪種方法時應該使用哪種方法來確定要單擊的對象。
有人可以告訴我您能想到的最簡單的方法來確定要單擊的對象,以便我可以使用glut函數獨立移動該對象嗎?
不管您是使用2D還是3D,最簡單的解決方案是為每個可拾取對象分配唯一的顏色,這通常是根本不使用的。 然后,對於每個單擊事件,您將渲染到(向后緩沖區)同一場景,並將唯一的顏色應用於每個對象。 通過禁用照明等,問題就變成了以下一種情況:查看鼠標下方的像素顏色並使用查找表查看單擊了哪個對象。
即使是16位色深,仍然可以為您提供2 ^ 16個獨特的可拾取對象,實際上,在現代應用程序中很少有少於2 ^ 24個對象。
在處理2D對象時,如果鼠標的位置在對象內部 ,則指向該對象。 對於內部而言,這種概念因幾何形狀的不同而不同。
對於矩形寬度的左上角c
和width
, height
,該函數可能如下所示:
bool isInsideRectangle(double x, double y) {
// The mouse is inside if the coordinates are 'inside' all walls
return (x > c.x &&
y > c.y &&
x < c.x + width &&
y < c.y + height);
}
對於具有中心c
和半徑r
的圓,它可能看起來像這樣:
bool isInsideCircle(double x, double y) {
// The mouse is inside if the distance to the center of the circle
// is less than the radius
return std::sqrt((x - c.x)*(x - c.x) + (y - c.y)*(y - c.y)) < r;
}
對於其他形狀,您將必須找出另一個函數來計算鼠標位置是否在內部,但是在許多情況下,您可以將其簡化為邊界矩形或球形。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.