首页 / 浏览问题 / 组件GIS / 问题详情
iobject .net 已知两个三维点A和B,如何设置相机参数从A点看向B点
14EXP 2020年07月20日
使用产品:iobject .net 10i 操作系统:win7 x64
问题详细描述:已知两个三维点A和B,怎么通过设置Camera或者LookAt对象,指定相机位于A点,并看向B点。

2 个回答

通过设置scene的FirstPersonCamera 属性,FirstPersonCamera获取或设置的是以当前场景的摄像机(即人眼观看的位置)为基准点进行操作。看想B点就需要自己去实现,计算两个点的方位、俯仰角等等,来设置scene的camera。
4,620EXP 2020年07月21日
我现在是用camera属性反反复复设置了很多次了,感觉最终呈现的不是想象中的效果。不知道是不是我理解的有问题。

点都加到场景中了,我找好了一个视角,确定方位、俯仰角之后,把两个值设定成常量,去调整相机的位置为添加到场景中的点,但相机直接就飞不见了。

现在感觉 想要设置相机在某一点,并不能直接这么设置这个坐标,似乎应该还有个什么转换。

 Camera myCamera = new Camera();
            myCamera.Longitude = pWayPoint.CameraPoint.X;
            myCamera.Latitude = pWayPoint.CameraPoint.Y;
            myCamera.Altitude = pWayPoint.CameraPoint.Z;
            myCamera.AltitudeMode = SuperMap.Data.AltitudeMode.RelativeToGround;
            myCamera.Heading = 127;
            myCamera.Tilt = 80;
            this._Scene2.FirstPersonCamera = myCamera;

你的视点是如何找的,在idesktop中打开你的数据,在飞行管理里面,新建一个飞行路线,选定好需要设置的视角角度后,在右边的站点管理中,点击第一个功能根据当前视角去添加站点,查看当前视角的信息,把这个视角参数拿去组件里面设置

我的需求是这样的,已经在场景中得到了两个点,点A和点B,现在就想把相机设置为从点A处看到点B处的效果。

两个点的坐标肯定是对的,不然也显示不出来,但通过这两个点设置坐标是怎么都不对。 我也通过系统把相机拉到合适的位置,调试获取了相机的参数,感觉相机的位置相关的参数和A点位置差别挺大的。  不知道应该怎么去计算。

按道理 我只要把点A的位置设置给相机的Longitude、Latitude、Altitude、Heading 和Tilt参数就可以了,但实际上这几个参数似乎相互有影响,特别是设置了Tilt参数后,相机就飞了。

            Camera myCamera = new Camera();

            myCamera.Longitude = pWayPoint.CameraPoint.X;
            myCamera.Latitude = pWayPoint.CameraPoint.Y;
            myCamera.Altitude = pWayPoint.CameraPoint.Z;
            myCamera.AltitudeMode = SuperMap.Data.AltitudeMode.RelativeToGround;
            myCamera.Heading = 127;
            myCamera.Tilt = 80;

经过和技术支持讨论和摸索,正确实现方法如下。

假设A点位this.CameraPoint,B点为this.TargetPoint。

代码如下。

this._SceneControl.Scene.FirstPersonCamera = this.GetFirstPersonCamera();

 public Camera GetFirstPersonCamera()
        {
            Camera myCamere = new Camera();
            myCamere.Longitude = this.CameraPoint.X;
            myCamere.Latitude = this.CameraPoint.Y;
            myCamere.Altitude = this.CameraPoint.Z;
            myCamere.AltitudeMode = AltitudeMode.Absolute;

            //计算Heading
            double myAngleBaseX = this.CalAngleBaseX(this.CameraPoint.X, this.CameraPoint.Y, this.TargetPoint.X, this.TargetPoint.Y);
            myAngleBaseX = myAngleBaseX * 180 / Math.PI;
            double myHeading = 360 - myAngleBaseX + 90;
            if (myHeading >= 360)
            {
                myHeading = myHeading - 360;
            }
            myCamere.Heading = myHeading;

            //计算Title
            double myTilt = 0;
            double myHLength = Math.Sqrt(Math.Pow(this.CameraPoint.X - this.TargetPoint.X, 2) + Math.Pow(this.CameraPoint.Y - this.TargetPoint.Y, 2));
            double myZ = Math.Abs(this.CameraPoint.Z - this.TargetPoint.Z);
            if (myHLength == 0 && this.CameraPoint.Z > this.TargetPoint.Z)
            {
                myTilt = 0;
            }
            else if (myHLength == 0 && this.CameraPoint.Z < this.TargetPoint.Z)
            {
                myTilt = 180;
            }
            else if (this.CameraPoint.Z == this.TargetPoint.Z)
            {
                myTilt = 90;
            }
            else
            {
                double myAngle = Math.Atan(Math.Sqrt(myZ / myHLength)) * 180 / Math.PI;
                if (this.CameraPoint.Z > this.TargetPoint.Z)
                {
                    myTilt = 90 - myAngle;
                }
                else
                {
                    myTilt = 90 + myAngle;
                }
            }
            myCamere.Tilt = myTilt;
            return myCamere;
        }
//计算基于X轴 逆时针的角度
        private double CalAngleBaseX(double pX1, double pY1, double pX2, double pY2)
        {
            double angle = 0;

            if (pX1 != pX2)
            {
                angle = (float)Math.Atan((pY1 - pY2) / (pX1 - pX2));

                if (pX1 > pX2)
                {
                    angle = angle + Math.PI;
                }
            }
            else
            {
                if (pY1 < pY2)
                {
                    angle = (90.0 / 180.0 * Math.PI);
                }
                else if (pY1 > pY2)
                {
                    angle = (-90.0 / 180.0 * Math.PI);
                }
            }
            return (float)angle;
        }

14EXP 2020年08月23日
...