关于3D场景中Camera的旋转

jpct-ae---第三人称视角3D场景漫游 3D模型的载入在前面已经说过了,jpct-ae中的方法非常简单。 这里要说的是第三人称视角的3D场景漫游。第三人称视角是说在3D场景中有一个漫游的物体,这个物体并非我们当前的camera,如果是camara的话,就是第一人称视角了。 以第三人称视角漫游的时候要注意几个问题,或者说实现一下的几个效果。 1、当物体漫游时,我们的视角(即当前camera)也随之移动。 2、当物体旋转时,我们的视 阅读详情

【本人初学,一点感悟,如有不当,请不吝指教】

       很多人想达到3D场景中,基于鼠标控制的Camera任意角度旋转,其实不难,分为其下两步:

一、 基于鼠标移动过程的建模

这一步,在于你是如何理解mouse在一个二维平面从previousposition到currentpositon所表示的意图,网络上有一种很通用的方法“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;

        }

 

好,现在大功告成,其实真不难,哎,折腾了1天多,希望对大家有用,如果有更好的模型或者更好的实现方法,我希望能得到你的指点,我的邮箱:v-xyang@microsoft.com,谢谢你。

 

 

Manim 3D动画 这篇说说Manim如何渲染3D动画.官网中关于3D动画的示例很少, 纯文字的描述我只能说有点抽象... 所以我希望本篇内容结合动画效果可以帮助兄弟萌更舒服的上手Manim的3D动画.本篇文章介绍了Manim的三维坐标轴, 三维动画, 三维函数图像.欢迎关注公众号: 算法铁金库. ThreeDAxes表示三维坐标轴.示例代码: 参数x_axis_config是字典类型, 参数就是NumberLine的参数.效果如下:渲染3D动画需要使用ThreeDScene.接下来介绍ThreeDScene的方法:设置相 阅读详情

相关推荐

Android编程实现3D立体旋转效果的实例代码

子空间直接添加如同framelayout 相同 如要如图效果 唯一要求子空间必须位于父控件中心且宽高等大小 为了方便扩展而做 如有其他需求可自行更改 (注 所有子控件 最好添加上背景 由于绘制机制和动画原因 没有背景会有部分重贴) 内部子view 可为 任意ViewGroup。具体的网上其他 类似效果到底有什么不同于优势在此不多做描述 实现方式上有哪些不同 嗯 下次有空再细说(由于需要大量图文描述 3D的变换过程才讲的清楚,有些间隔的时间也稍长 只记得大概的思路过程)。

huahaiyi的博客 680

保姆级教程:用Unity Camera和Cinemachine分别打造一个可拖拽、缩放、旋转的3D场景观察器

本文提供了一份详细的Unity教程,教你如何使用原生Camera组件和Cinemachine分别实现可拖拽、缩放、旋转的3D场景观察器。通过对比两种技术方案,帮助开发者理解底层原理并快速搭建生产级功能,适用于电商展示、游戏预览和建筑设计等多种场景。

weixin_26846533的博客 236

Unity URP中Camera Stacking与RenderTexture实现3D模型UI嵌入

在游戏开发中,实时渲染与UI界面的高效结合是提升用户体验的关键技术。其核心原理在于通过分层渲染技术,将3D内容与2D界面分离处理,再通过动态纹理进行合成。Camera Stacking作为URP渲染管线的重要特性,实现了渲染层的叠加与合成,而RenderTexture则充当了GPU内存中的动态画布,允许将特定摄像机的输出实时映射到UI元素上。这项技术的工程价值在于解决了传统方案中渲染顺序混乱、性能开销大和维护困难等问题,为角色头像、装备预览、动态小地图等应用场景提供了标准化的解决方案。通过合理配置摄像机堆叠

weixin_30660027的博客 315

WPF编程--3D机械臂底座旋转

WPF编程--3D机械臂底座旋转

1419

WPF实现的3D地球贴图旋转

WPF实现的3D地球贴图旋转 WPF实现的3D地球贴图旋转 WPF实现的3D地球贴图旋转 WPF实现的3D地球贴图旋转 WPF实现的3D地球贴图旋转

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

10WPF---3D图形

NavigationStopped:在调用应用程序中的导航器的 StopLoading 方法时发生,或者当导航器在当前导航正在进行期间请求了一个新导航时发生。正交相机:在这种投影模式下,无论物体距离相机距离远或者近,在最终渲染的图片中物体的大小都保持不变,这对于渲染2D场景或者UI元素是非常有用的。Navigated:在已经找到应用程序中的导航器要导航到的内容时发生,尽管此时该内容可能尚未完成加载。NavigationFailed:在应用程序中的导航器在导航到所请求内容时出现错误的情况下发生。

qq_58563355的博客 2104

三角洲自动购买工具 —— 基于 OCR 的价格识别与自动点击

通过的方式,我们可以轻松实现自动化的“价格监控 + 自动点击”工具。它的优势在于通用性—— 只要能截屏识别价格,就能用于任何程序,不依赖特定 API。未来可以扩展的功能:自动保存配置到文件。支持多价格区域检测。增加快捷键启停功能。

qq_62975494的博客 2420

3D变形tranform(附实例、图解)

目录 旋转rotate 透视perspective translateZ translate3d 动画 animation 前言 css中三个方向的设定为: X左边是负值,右边是正值 Y上边是负值,下边是正值 Z里面是负值。外面是正值 正文 旋转rotate rotateX(); 沿x轴旋转 RotateY(); 沿y轴旋转 RotateZ(); 沿z轴旋转 透视perspective 透视原理:近大远小 perspective:视距,表示视点距离屏幕的长短。视点,用于模拟透视效果时人眼的位置

weixin_45135068的博客 1569

北斗B1频点信号捕获实战:如何应对NH码跳变带来的挑战?

本文深入探讨了北斗B1频点信号捕获中NH码跳变带来的核心挑战。针对NH码以1kHz速率调制导致的相干积分中断和相关峰畸变问题,文章提出并详细解析了一种基于伪码与多普勒频率分离技术的优化捕获方案。该方案通过差分处理消除NH跳变影响,并利用匹配滤波器与FFT分别进行码相位和多普勒频率的快速估计,有效提升了弱信号环境下的捕获灵敏度和稳定性,为北斗接收机设计提供了实用的工程参考。

joy55的博客 535

特斯拉数字孪生4.0体系解析:从“数字镜像“到“持续进化“的造车革命

当每一辆汽车都拥有自己的“数字分身”,我们正见证的不仅是技术革新,更是整个制造业文明形态的跃迁。其数字孪生体已超越“数字镜像”的被动属性,成为。特斯拉年服务收入超1200美元/车的业绩表明,数字孪生正在将汽车从“交通工具”转变为“持续增值的智能终端”。构建起覆盖设计、制造、使用、服务全链条的虚拟镜像体系,将物理世界与数字世界的融合推向新高度。:特斯拉的实践证明,数字孪生已从“技术选项”升级为“战略必选项”。不仅重塑了汽车产品的价值创造逻辑,更预示着整个制造业向“元宇宙工业”演进的新范式。

beige888的博客 1609

WPF3D模型渲染和模型对接

一篇文章教会你WPF中3D渲染和模型对接 里面有个3D旋转地图的Demo呦,有兴趣的可以尝试。

代码改变世界 2566

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5512

Unity3D学习笔记——Camera绕着物体旋转

在Unity的文档里面和百度上都没有找到如何使Camera旋转的方法,可能是我不会搜索吧,最后在百度知道上面看到了一个相关性不是很大的问题触发了我的灵感。 Unity中的GameObject之间有一个Parenting关系,如果A是B的Parent,A怎么移动怎么旋转,B就怎么移动和旋转。了解了这个就好办了, 我虽然不会旋转Camera,但是我会旋转Cube啊,把Cube设置为Camera的p...

weixin_30433075的博客 221

诊断CAPL自动化(3)——封装了接收诊断数据的通用CAPL脚本函数库

DiagGetRespPrimitiveSize (获取诊断响应的单个数据) diagGetPrimitiveData (获取诊断返回的所有数据) DiagGetRespParameter(数值类型) DiagGetRespParameter(字符串类型) DiagGetRespParameter(byte数组)

蚂蚁小兵 6222

25 - GRACE Mascon数据缺失月份数据插值

本篇基于文章的相关内容和文章公开的奇异谱分析(SSA)插值算法程序包,对grace Mascon数据种缺失的月份进行 插值 ,总结了使用程序包的相关过程,可以将该程序应用到其他数据处理插值计算中。

weixin_43339605的博客 1843

Away3D基础之摄像机

原英文地址:http://www.flashmagazine.com/Tutorials/detail/away3d_basics_the_cameras/ 翻译原文地址:http://blog.youkuaiyun.com/liminxin272/article/details/6893036 相机camera类是观察3D世界必须借助的工具.其作用与现实世界里的相机一样,3D世界里的

木兮小站 3940

配置适合Gurobi的机器硬件环境需要考虑的因素

介绍了在为gurobi选择合适的硬件环境时,需要考虑三个方面的因素;

Linshaodan520的博客 1066

Unity实现使用鼠标实现旋转Camera的功能

Unity实现使用鼠标实现旋转Camera的功能

波波斯维奇 1384

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Flash 3D引擎(Sandy3D)应用指南 3——使用摄像机。

原文地址:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut03 这个指南的目标在这个指南中,我们将学习Camera3D对象的使用,在之前的指南里,我们只是使用摄像机作为整个场景的观察点,但从来没有真正使用过它,就连访问它的属性和方法都没有。 Camera3D 就像是一个静态对象——我们可以对它进行移动、旋转、滚动、倾斜。

民工 1750

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

away3d 4.0.9Gold 学习笔记 摄像机与摄像机控制器(7)

View3D在初始化时候就已经创建的Camera3D所以有时候我们没有创建Camera3D但我们依然可以看到3D场景。 Camera3D的默认初始位置在x:0,y:0,z:-1000。 Camera本身属性较多。我列举一些比较常用的。camea.lookAt(new Vector3D).这个是让摄像机指着某点。即便摄像机移动中。也会一直指着此点。camera.roll(angle)摄像机绕绿色的轴...

chqj_163的专栏 670

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Godot Little Camera Preview核心功能解析:2D与3D相机实时预览

Godot Little Camera Preview是一款专为Godot引擎设计的高效相机预览插件,它提供画中画(Picture-in-Picture)风格的实时预览功能,同时支持2D和3D相机,帮助开发者在编辑过程中更直观地调整相机参数和视角。 ## 核心功能概览 这款插件的核心价值在于解决了Godot引擎中相机预览的痛点——无需频繁切换视图即可实时查看相机效果。通过在编辑器界面中嵌入一个

gitblog_00759的博客 1142

2021SC@SDUSC ClayGL Camera类分析(七)

2021SC@SDUSC ClayGL Camera类分析(七)

Yes_Utopia的博客 235

自定义View—利用Camera实现3D翻转动画

利用Camera实现3D翻转动画

liujian_30的博客 868

Away3d基础 3 -相机

原英文地址:http://www.flashmagazine.com/Tutorials/detail/away3d_basics_the_cameras/相机camera类是观察3D世界必须借助的工具.其作用与现实世界里的相机一样,3D世界里的照相机应用通视原理将3D物进行缩放、聚焦、定位等。在本教程中你将会学到away3d里的三种类型的“相机”无论你想在Away3D里做什么,有几个

剪裁人生 的专栏 863

JavaFX 3D部分介绍(2) Camera

本篇文章将紧接着上一篇进行JavaFX 3D API的讲解。 JavaFX 3D Graphics API中,Camera是一个Node,并且可以被直接添加到JavaFX的Scene中。我们可以在3D UI布局中随意的移动Camera,这将不同于2D布局。 首先,Camera的坐标体系是这样的: X轴指向右边,Y轴指向下面,Z轴指向屏幕远离观察者的方向。

Wing的博客 3177
上一篇: Silverlight开发入门篇:(一)起步
下一篇: 结队编程,非诚勿扰
codingcrazy
博客等级 码龄16年 14粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值