我正在尝试实现一个跟随移动物体的摄像机。我已经实现了以下功能:
void Camera::espheric_yaw(float degrees, glm::vec3 center_point)
{
float lim_yaw = glm::radians(89.0f);
float radians = glm::radians(degrees);
absoluteYaw += radians;
... clamp absoluteYaw
float radius = 10.0f;
float camX = cos(absoluteYaw) * cos(absoluteRoll) * radius;
float camY = sin(absoluteRoll)* radius;
float camZ = sin(absoluteYaw) * cos(absoluteRoll) * radius;
eyes.x = camX;
eyes.y = camY;
eyes.z = camZ;
lookAt = center_point;
view = glm::normalize(lookAt - eyes);
up = glm::vec3(0, 1, 0);
right = glm::normalize(glm::cross(view, up));
}
我想将此功能(和俯仰版本)用于跟随移动3D模型的相机。现在,它在center_point为(0,1,0)时起作用。我认为我的位置正确,但是向上向量显然并不总是(0,1,0)。
如何获取相机的上,下和正确矢量?然后,如果以此方式更新相机的眼睛位置,当另一个对象(以center_position参数为中心)移动时,相机将如何移动?
这个想法是每当我有鼠标输入时,使用centered_value =移动对象的中心来更新此内容。然后将gluLookAt与我的相机的视线,眼睛和向上值一起使用(而lookAt将是眼+视线)。
答案 0 :(得分:0)
跟随移动的对象就是将相机对准该对象的问题。这就是典型的void main() async {
ProductNetwork productNetwork = ProductNetwork();
var data = await productNetwork.fetchProduct();
print(data.toString());
}
class ProductNetwork {
List<Product> allProducts = List<Product>();
Future<List<Product>> fetchProduct() async {
int productId = 0;
String url =
'http://example.com/api/Product/GetProduct?id=${productId.toString()}';
final http.Response response = await http.get(url);
if (response.statusCode == 200)
await allProducts.add((Product.fromJson(json.decode(response.body))));
else
throw Exception('Failed. Status Code: ${response.statusCode}');
return allProducts;
}
}
函数的作用。参见数学here,然后使用lookAt
。
“ Arcball”技术用于用鼠标旋转。参见一些数学here。
这个想法是从屏幕上的位置获取两个向量(第一,第二)。对于每个向量,glm::lookAt()
的取值取决于鼠标“行进”的像素和窗口的大小。 X,Y
由“轨迹球”数学计算得出。使用这两个向量(对它们进行归一化后),其叉积以相机坐标给出旋转轴,其点积给出角度。现在,您可以将相机旋转Z
如果您走另一条路线(例如,自行计算摄像机矩阵),则必须自行更新摄像机的“向上”方向。请记住,它垂直于相机的其他两个轴。