Tôi có một số hình học 2D. Tôi muốn có một số giới hạn rect quanh hình học của tôi, và sau đó làm cho một phiên bản nhỏ hơn của nó ở một nơi khác trên máy bay. Dưới đây là nhiều hay ít mã tôi phải làm rộng và dịch:OpenGL: tỷ lệ sau đó dịch? và làm thế nào?
// source and dest are arbitrary rectangles.
float scaleX = dest.width/source.width;
float scaleY = dest.height/source.height;
float translateX = dest.x - source.x;
float translateY = dest.y - source.y;
glScalef(scaleX, scaleY, 0.0);
glTranslatef(translateX, translateY, 0.0);
// Draw geometry in question with its normal verts.
này hoạt động chính xác như mong đợi cho một chiều hướng đưa ra khi nguồn gốc đích là 0. Nhưng nếu nguồn gốc cho, nói, x, là nonzero, kết quả vẫn được chia tỷ lệ chính xác nhưng trông giống như (?) nó được dịch sang một cái gì đó gần bằng không trên trục đó anyways-- hóa ra nó không chính xác giống như nếu dest.x là số không.
Ai đó có thể chỉ ra điều gì đó hiển nhiên tôi đang thiếu?
Cảm ơn!
BÁO CÁO CUỐI CÙNG Mỗi câu trả lời của Bahbar và Marcus bên dưới, tôi đã thực hiện thêm một số thử nghiệm và giải quyết vấn đề này. Lời bình luận của Adam Bowen là một mẹo nhỏ. Tôi đã thiếu hai sự kiện quan trọng:
- Tôi cần phải mở rộng xung quanh trung tâm của hình tôi quan tâm.
- Tôi cần áp dụng các biến đổi theo thứ tự ngược lại trực giác (đối với tôi).
Đầu tiên là loại hiển nhiên khi nhìn lại. Nhưng đối với các lập trình viên tốt/nhà toán học tồi như tôi: Hóa ra trực giác của tôi hoạt động trong những gì mà Red Book gọi là "Grand, Fixed Coordinate System", trong đó có một mặt phẳng tuyệt đối, và hình của bạn di chuyển xung quanh mặt phẳng bằng cách sử dụng biến đổi. Điều này là tốt, nhưng với bản chất của toán học đằng sau xếp chồng nhiều biến đổi thành một ma trận, nó trái ngược với cách mọi thứ thực sự hiệu quả (xem câu trả lời bên dưới hoặc Sổ đỏ để biết thêm). Về cơ bản, các biến đổi được "áp dụng" trong "thứ tự ngược lại" để chúng xuất hiện trong mã. Đây là giải pháp làm việc cuối cùng:
// source and dest are arbitrary rectangles.
float scaleX = dest.width/source.width;
float scaleY = dest.height/source.height;
Point sourceCenter = centerPointOfRect(source);
Point destCenter = centerPointOfRect(dest);
glTranslatef(destCenter.x, destCenter.y, 0.0);
glScalef(scaleX, scaleY, 0.0);
glTranslatef(sourceCenter.x * -1.0, sourceCenter.y * -1.0, 0.0);
// Draw geometry in question with its normal verts.
Tóm lại, thay đổi thứ tự thành glTranslate (dest); glScale (quy mô); glTranslate (nguồn); –
Adam: Điều này dường như không hoạt động như bạn gợi ý, mặc dù tôi tò mò-- bạn có thể giải thích lý do tại sao thứ tự sẽ như thế và có thể cung cấp một ý tưởng rõ ràng hơn về cách nó sẽ liên quan đến mã hiện tại ? Có lẽ tôi chỉ hiểu sai mã giả của bạn. Cảm ơn! –
Nevermind: "không hoạt động" là giá trị béo phì trong trường hợp này. Sau khi sửa chữa, chúng tôi đang kinh doanh. Xem câu hỏi được cập nhật để biết thêm. Cảm ơn! –