EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 4281|回复: 50
打印 上一主题 下一主题

3D场景中Camera的旋转

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-9 14:40:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多人想达到3D场景中,基于鼠标控制的Camera任意角度旋转,其实不难,分为其下两步:
一、
基于鼠标移动过程的建模
这一步,在于你是如何理解mouse在一个二维平面从previouspositioncurrentpositon所表示的意图,网络上有一种很通用的方法“virtual trackball”。本人目前也是采用的这种方法,故而在这里简单介绍一下
1.
直观感觉(Daniel Lehenbauer 主页)

                               
登录/注册后可看大图
      

                               
登录/注册后可看大图

Figure 1 Moving with mouse

2.
理解


                               
登录/注册后可看大图
                     

                               
登录/注册后可看大图
把整个空间的场景先归一化到一个单位立方体,视野里的平面即为一个中心切面,鼠标在平面(2维空间)的坐标可以映射到一个三维球面上(注意:这里是映射到3维球面上,如果你有更好的模型,完全可以映射到更好的三维空间中),这样就理解成球面上的移动,进而产生旋转的效果。
这是2维平面点映射到3维球面点的方法:
    private Vector3D TransTo3DPoint(Double width, Double height, Point point)
    {
        Double x = point.X / (width / 2);       // Scale so bounds map to [0,0] - [2,2]
        Double y = point.Y / (height / 2);

        x = x - 1;          // Translate 0,0 to the center
        y = 1 - y;          //Flip so y is up instead of down

        Double ztemp = 1 - x * x - y * y;       // z^2 + x^2 - y^2 = 1
        Double z = ztemp > 0 ? Math.Sqrt(ztemp) : 0;
        return new Vector3D(x, y, z);
    }


3.
根据模型球面上初始点和当前点,得到旋转轴和旋转角度,调用旋转Camera的方法,即可实现空间中的所有场景的自由旋转。
private void Rotate(Point currentPosition)
{
    // Call the TransTo3DPoint to get the currentPosition3D
    Vector3D currentPosition3D = TransTo3DPoint(GoWindow.ActualWidth, GoWindow.ActualHeight, currentPosition);
    // Call Vector3D.CrossProduct to realize the 叉乘
    Vector3D axis = Vector3D.CrossProduct(previousPosition3D, currentPosition3D);
    // Call Vector3D.AngleBetween to achieve the angle between two vectors
    Double angle = Vector3D.AngleBetween(previousPosition3D, currentPosition3D);
    // rotate the camera
    RotateCamera(axis, angle);
    // erery time we should reset the previousPosition
    previousPosition3D = currentPosition3D;
}


二、
基于旋转向量和旋转角度的Camera旋转
首先需要定义Camera的旋转方式(我之前找这个无果,想到了用旋转矩阵这种方法,套用了一堆3维空间的坐标系旋转公式,效果并不理想):
<PerspectiveCamera.Transform>

<Transform3DGroup>

<RotateTransform3D x:Name="axisYRTransform">

<RotateTransform3D.Rotation>

<AxisAngleRotation3D x:Name="axisYRotation" Angle="0" Axis="0 1 0" />

</RotateTransform3D.Rotation>

</RotateTransform3D>

</Transform3DGroup>

</PerspectiveCamera.Transform>

那么接下来要做的就是写上一个小小的函数用来旋转特定的Camera了:
private void RotateCamera(Vector3D axis, Double angle)
        {
            Vector3D vecZero = new Vector3D(0.0,0.0,0.0);
            if (vecZero == axis || 0 == angle)
                return;

            Quaternion delta = new Quaternion(axis, angle);
            // axisYRotation is the name of camera AxisAngleRotation3D
            Quaternion q = new Quaternion(axisYRotation.Axis, axisYRotation.Angle);

            q *= delta;

            if (Vector3D.Equals(q.Axis, vecZero))
                return;

            axisYRotation.Axis = q.Axis;
            axisYRotation.Angle = q.Angle;
        }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

14

主题

2892

帖子

2085

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
2085
推荐
发表于 2016-3-25 10:46:12 | 只看该作者
<( ̄︶ ̄)>  不错o!~

14

主题

2892

帖子

2085

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
2085
推荐
发表于 2016-2-23 09:41:04 | 只看该作者
顶!d=====( ̄▽ ̄*)b

1

主题

250

帖子

1069

积分

BIM项目负责人

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

积分
1069

社区QQ达人

推荐
发表于 2015-8-7 10:41:14 | 只看该作者
好东西!支持一下

32

主题

830

帖子

1383

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1383
5F
发表于 2014-2-27 14:42:51 | 只看该作者
路过!!!
不发表意见……

28

主题

763

帖子

1425

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1425
6F
发表于 2014-2-27 14:45:15 | 只看该作者
路过!!!
不发表意见……

16

主题

842

帖子

1377

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1377
17F
发表于 2014-4-1 10:37:12 | 只看该作者
(*^__^*) 嘻嘻……
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-23 10:42

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表