旋转的摄像头

这几天熟悉了一下Entity,SceneManager,SceneNode。自己可以简单的实现了站立的robot和ninja,总感觉静态的场景不好玩,想做一下动态的场景,由于本人目前是初学者,所以也就只能做做关键帧动画,骨骼动画就留在后面实现吧,hoho~

 

定义一个10秒种的动画,这个动画包含一个动画轨迹(上下翻转)。让这个动画应用到当前摄像机上去,程序运行时,我(第一人称摄像机)应该在上下翻转。

 

       在createScene函数里做初始化工作。

       首先我们考虑怎样可以把动画应用到当前摄像机上。因为一个动画可以应用到一个节点上,所以可以创   建一个节点并将当前摄像机attach到这个节点上去,代码如下:

        SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChild();

        camNode->attachObject(mCamera);

 

       下面定义动画、动画轨迹以及关键帧:

        // 定义动画,指定动画的名称及长度(这里为10秒)

        Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);

        // 指定动画关键帧之间的插值方式(包括线性插值和样条插值)

         anim->setInterpolationMode(Animation::IM_SPLINE);

        // 定义动画的一个动画轨迹,并指定这个轨迹是作用到camNode节点上的

        AnimationTrack* track = anim->createTrack(0, camNode);

        // 定义动画轨迹包含的关键帧,下面定义了四个关键帧,加上起始帧

              // 五个关健帧形成了一个翻转的动画。

        KeyFrame* key = track->createKeyFrame(0); // startposition

        key = track->createKeyFrame(2.5);

        key->setTranslate(Vector3(500,500,-1000));

        key = track->createKeyFrame(5);

        key->setTranslate(Vector3(-1500,1000,-600));

        key = track->createKeyFrame(7.5);

        key->setTranslate(Vector3(0,-100,0));

        key = track->createKeyFrame(10);

        key->setTranslate(Vector3(0,0,0));             

 

       然后定义AnimationState类的对象,它和刚才定义的动画类相对应。设置动画的状态为启用:

        mAnimState = mSceneMgr->createAnimationState("CameraTrack");

        mAnimState->setEnabled(true);     // 启用该动画

       到此,初始化工作就做完了.

 

最后,要想使动画动起来,我们需要重载ExampleFrameLisener类的frameStarted函数,并调用下面的函数,根据传入的时间来设置动画的状态:    mAnimState->addTime(evt.timeSinceLastFrame);

 

以下是进行重载ExampleFrameLisener类的frameStarted函数的操作。

#include "ExampleFrameListener.h"
AnimationState *mAnimState;
class ProjectiveDecalListener : public ExampleFrameListener
{
public:
 ProjectiveDecalListener(RenderWindow* win, Camera* cam)
  : ExampleFrameListener(win, cam)
 {

 }

 ~ProjectiveDecalListener()
 {

 }

 bool frameStarted(const FrameEvent& evt)
 {
  mAnimState->addTime(evt.timeSinceLastFrame);
  return ExampleFrameListener::frameStarted(evt);  //没有这句的话,鼠标和键盘将无法控制

 }

};

 

重载ExampleApplication类中的createFrameListener函数,可以放在CreateScene()的后面。

 void createFrameListener(void)
 {
  mFrameListener= new ProjectiveDecalListener(mWindow, ExampleApplication::mCamera);
  mRoot->addFrameListener(mFrameListener);
 }

 这里需要对上面这个函数进行详细的讲解:

因为Root类是要每帧更新的,他也了解FrameListeners。我们首先要创建ProjectiveDecalListener的实例,然后把他注册到Root对象中。

mRoot和mFrameListener变量是在ExampleApplication类中定义的。addFrameListener方法添加一个帧监听者,removeFrameListener方法移除帧监听者(也就是说FrameListener就不用在更新了)。注意add|removeFrameListener方法仅仅是得到一个指向FrameListener的指针(也就是说FrameListener并没有一个名字你可以移除她)。这就意味着你需要对每一个FrameListener持有一个指针,让你随后可以移除他们。


 这样我们就可以看到旋转摄像头里所看到的场景图像了。

 

 

 

### 关于传感器控制摄像头旋转的相关信息 在 Android 设备上,特别是针对 Mediatek 平台(如 mt8788),实现摄像头方向旋转主要依赖于底层硬件抽象层 (HAL) 中的配置文件以及应用层中的设置。 #### HAL 配置层面 对于基于 Mediatek 芯片组的设备,在 `cfg_setting_imgsensor.cpp` 文件中定义了相机模块的各种参数。其中 `.orientation` 参数用于指定图像传感器相对于设备物理位置的角度偏移量[^1]。当希望调整预览画面或拍摄照片的方向时,可以通过修改此字段来达到目的: ```cpp // 修改前,默认值可能为 90 度 .orientation = 90, // 修改后,将角度更改为 180 或其他所需数值 .orientation = 180, ``` 这种更改使得即使手机处于横向模式下,摄像机捕捉到的画面也会按照设定好的角度进行自动矫正,从而确保最终显示给用户的视图符合预期[^2]。 #### Camera API 层面 除了 HAL 设置外,在更高层次的应用程序接口处也可以进一步处理图像方向问题。例如,在 Android 13.0 及其后续版本中,通过 Camera2 API 对象可以在构建捕获请求时显式地指定期望的照片朝向: ```java rootBuilder.setParam(CaptureRequest.JPEG_ORIENTATION, 90); ``` 这段代码片段会告诉系统以顺时针计算的方式将所拍下的 JPEG 图像转过 90 度角[^3]。同样地,在涉及视频录制或其他类型的媒体流操作时也应考虑适当调整方位数据。 #### 实际应用场景注意事项 值得注意的是,不同型号之间可能存在细微差异;因此,在实际项目实施过程中应当仔细查阅具体平台文档并测试各种场景下的表现情况。此外,还需注意某些特殊情况下可能会涉及到权限申请等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值