如何从3d中的任意点缩放相机?

如何从3d中的任意点缩放相机?,3d,camera,unity3d,zooming,point,3d,Camera,Unity3d,Zooming,Point,我正在制作一个由多点触摸控制的交互式地图应用程序。我想在地图上导航,同时将开始触摸的位置保持在触摸下。我使用透视视图,相机向下朝向地图的角度永远不会改变。我在移动和旋转。通过计算当前触摸和上一次触摸的世界坐标距离(通过在基面上投射光线)移动,并将相机移动到相同的距离和方向。旋转通过围绕触摸点旋转相机来工作 现在随着缩放,我遇到了更多的困难。因为当你想从屏幕上的任意点变焦时,你不仅要向前移动相机,还要朝着触摸点移动。我有一个近似值,但它不是很精确,而且不能很好地缩放。是否有一种方法可以精确计算相机

我正在制作一个由多点触摸控制的交互式地图应用程序。我想在地图上导航,同时将开始触摸的位置保持在触摸下。我使用透视视图,相机向下朝向地图的角度永远不会改变。我在移动和旋转。通过计算当前触摸和上一次触摸的世界坐标距离(通过在基面上投射光线)移动,并将相机移动到相同的距离和方向。旋转通过围绕触摸点旋转相机来工作

现在随着缩放,我遇到了更多的困难。因为当你想从屏幕上的任意点变焦时,你不仅要向前移动相机,还要朝着触摸点移动。我有一个近似值,但它不是很精确,而且不能很好地缩放。是否有一种方法可以精确计算相机位置,以便缩放的点保持在相同的屏幕坐标上

我使用的是Unity3D(C#用于编写脚本)。下面是我的一些代码示例

Vector3 prevposition1; // Screen coordinates of previous touch1 
Vector3 nowposition1; // Screen coordinates of touch1 now
Vector3 prevposition2; // Screen coordinates of previous touch2
Vector3 nowposition2; // Screen coordinates of touch2 now
Vector3 prevhitpoint1; // World coordinates of previous touch1 on plane
Vector3 prevhitpoint2; // World coordinates of previous touch2 on plane
Vector3 nowhitpoint1; // World coordinates of touch1 on plane
Vector3 nowhitpoint2; // World coordinates of touch2 on plane

void RotateMap()
{
    transform.RotateAround(nowhitpoint1, Vector3.up, Mathf.Rad2Deg * -(prevAngle - nowAngle));
}

void MoveOverMap()
{
    Vector3 direction = nowhitpoint1 - prevhitpoint1;

    direction = direction * -1f;

    if (prevhitpoint1 != new Vector3(-1,-1,-1))
    {
        transform.position = transform.position + direction;
    } else
    {
        transform.position = transform.position;
    }
}
void ZoomMap()
{
    //Calculate direction from center
    RaycastHit hit1;
    int layerMask = 1 << 8;
    Ray ray1 = Camera.main.ViewportPointToRay (new Vector3(0.5f,0.5f,0));
    if (Physics.Raycast(ray1, out hit1, Mathf.Infinity, layerMask))
    {
    }                         

    //zoom
    Vector3 direction1 = hit1.point - nowhitpoint1;
    float distanceToCentersc1 = Vector2.Distance(nowposition1, new Vector2(Screen.width/2,Screen.height/2));
    transform.position = transform.position + (nowDistance - prevDistance) * transform.forward * zoomSpeed * Time.deltaTime;
    float distanceToCentersc2 = Vector2.Distance(Camera.main.WorldToScreenPoint(nowhitpoint1), new Vector2(Screen.width/2,Screen.height/2));

    //adjust position
    float distanceRatio = distanceToCentersc1/distanceToCentersc2; 
    transform.position = transform.position - direction1 * (1-distanceRatio);
}
Vector3 prevposition1;//上一次触摸的屏幕坐标1
矢量3当前位置1;//触摸屏的屏幕坐标现在为1
向量3前置位置2;//上一次触摸的屏幕坐标2
矢量3当前位置2;//触摸屏的屏幕坐标现在为2
向量3前置hitpoint1;//上一次接触1在平面上的世界坐标
向量3前置hitpoint2;//上一次触摸2在平面上的世界坐标
向量3 nowhitpoint1;//touch1在平面上的世界坐标
向量3 nowhitpoint2;//touch2在平面上的世界坐标
void RotateMap()
{
transform.RotateAround(nowhitpoint1,Vector3.up,Mathf.Rad2Deg*-(prevagle-nowagle));
}
void MoveOverMap()
{
矢量3方向=当前HitPoint1-当前HitPoint1;
方向=方向*-1f;
if(prevhitpoint1!=新向量3(-1,-1,-1))
{
transform.position=transform.position+方向;
}否则
{
transform.position=transform.position;
}
}
void ZoomMap()
{
//从中心计算方向
雷卡斯特hit1;

int layerMask=1您使用的是Android还是iOS?您应该添加相应的标记。另外,您使用的是什么地图API?您使用的是GLES吗?您有任何代码供我们查看吗?我在Unity中工作。不使用任何地图API或GLES。我编辑了我的问题。感谢您的指点!谢谢您的编辑,这有助于我更好地理解。走出好奇,你的目标是Windows 8机器上的代码吗?好的。至于变焦,对于透视相机,我会改变视野,而不是把相机移近。这里有一个可能会有帮助的答案:让我知道这个想法是否对你有帮助。它适用于带有大的多点触摸屏幕的Windows 7机器。如果你改变视野或把相机移近在相机向前的方向上,你成功地从屏幕中心进行了缩放。但是,如果你想在移动时将触摸的世界坐标保持在手指下方,只缩放相机是不够的,它还必须移动到某个位置。我想我可能需要使用线性代数。仍然没有找到它解决了。谢谢!如果我能自己解决,我会把解决方案贴在这里。