PuzzleSDK
CameraArcBallDemo类 参考

#include <Camera3DTest.h>

+ 类 CameraArcBallDemo 继承关系图:
+ CameraArcBallDemo 的协作图:

Public 成员函数

 CREATE_FUNC (CameraArcBallDemo)
 
 CameraArcBallDemo ()
 
virtual ~CameraArcBallDemo ()
 
virtual void onEnter () override
 
virtual void onExit () override
 
virtual void update (float dt) override
 
virtual std::string title () const override
 
void switchOperateCallback (cocos2d::Ref *sender)
 
void switchTargetCallback (cocos2d::Ref *sender)
 
void onTouchsMoved (const std::vector< cocos2d::Touch * > &touchs, cocos2d::Event *event)
 
void updateCameraTransform ()
 
void calculateArcBall (cocos2d::Vec3 &axis, float &angle, float p1x, float p1y, float p2x, float p2y)
 
float projectToSphere (float r, float x, float y)
 
- Public 成员函数 继承自 TestCase
 TestCase ()
 
 ~TestCase ()
 
virtual std::string subtitle () const
 
virtual Type getTestType () const
 
virtual float getDuration () const
 
virtual std::string getExpectedOutput () const
 
virtual std::string getActualOutput () const
 
virtual void restartTestCallback (cocos2d::Ref *sender)
 
virtual void nextTestCallback (cocos2d::Ref *sender)
 
virtual void priorTestCallback (cocos2d::Ref *sender)
 
virtual void onBackCallback (cocos2d::Ref *sender)
 
void setTestSuite (TestSuite *testSuite)
 
TestSuitegetTestSuite () const
 
float getRunTime () const
 
void setTestCaseName (const std::string &name)
 
std::string getTestCaseName () const
 
const cocos2d::Label * getSubtitleLable () const
 
const cocos2d::MenuItemImage * getRestartTestItem () const
 

Protected 属性

cocos2d::Layer * _layer3D
 
CameraType _cameraType
 
cocos2d::Camera * _camera
 
cocos2d::DrawNode3D * _drawGrid
 
cocos2d::Quaternion _rotationQuat
 
float _radius
 
float _distanceZ
 
OperateCamType _operate
 
cocos2d::Vec3 _center
 
int _target
 
cocos2d::Sprite3D * _sprite3D1
 
cocos2d::Sprite3D * _sprite3D2
 
- Protected 属性 继承自 CameraBaseTest
cocos2d::BillBoard * bill1
 
cocos2d::BillBoard * bill2
 
cocos2d::Label * l1
 
cocos2d::Label * l2
 
- Protected 属性 继承自 TestCase
cocos2d::MenuItemImage * _priorTestItem
 
cocos2d::MenuItemImage * _restartTestItem
 
cocos2d::MenuItemImage * _nextTestItem
 
cocos2d::Label * _titleLabel
 
cocos2d::Label * _subtitleLabel
 

额外继承的成员函数

- Public 类型 继承自 TestCase
enum class  Type { ROBUSTNESS , UNIT , GRAPHICAL_STATIC , MANUAL }
 
- Public 属性 继承自 TestCase
CC_CONSTRUCTOR_ACCESS __pad0__: virtual bool init() override
 

详细描述

在文件 Camera3DTest.h192 行定义.

构造及析构函数说明

◆ CameraArcBallDemo()

CameraArcBallDemo::CameraArcBallDemo ( )

在文件 Camera3DTest.cpp988 行定义.

990, _layer3D(nullptr)
992, _camera(nullptr)
993, _drawGrid(nullptr)
994, _radius(1.0f)
995, _distanceZ(50.0f)
997, _center(Vec3(0,0,0))
998, _target(0)
999, _sprite3D1(nullptr)
1000, _sprite3D2(nullptr)
1001{
1002}
OperateCamType _operate
Definition: Camera3DTest.h:222
cocos2d::Camera * _camera
Definition: Camera3DTest.h:217
cocos2d::DrawNode3D * _drawGrid
Definition: Camera3DTest.h:218
cocos2d::Vec3 _center
Definition: Camera3DTest.h:223
cocos2d::Layer * _layer3D
Definition: Camera3DTest.h:215
cocos2d::Sprite3D * _sprite3D2
Definition: Camera3DTest.h:226
CameraType _cameraType
Definition: Camera3DTest.h:216
cocos2d::Sprite3D * _sprite3D1
Definition: Camera3DTest.h:225

引用了 Free , 以及 RotateCamera.

◆ ~CameraArcBallDemo()

CameraArcBallDemo::~CameraArcBallDemo ( )
virtual

在文件 Camera3DTest.cpp1003 行定义.

1004{
1005}

成员函数说明

◆ calculateArcBall()

void CameraArcBallDemo::calculateArcBall ( cocos2d::Vec3 &  axis,
float &  angle,
float  p1x,
float  p1y,
float  p2x,
float  p2y 
)

在文件 Camera3DTest.cpp1125 行定义.

1126{
1127 Mat4 rotation_matrix;
1128 Mat4::createRotation(_rotationQuat, &rotation_matrix);
1129
1130 Vec3 uv = rotation_matrix * Vec3(0.0f,1.0f,0.0f); //rotation y
1131 Vec3 sv = rotation_matrix * Vec3(1.0f,0.0f,0.0f); //rotation x
1132 Vec3 lv = rotation_matrix * Vec3(0.0f,0.0f,-1.0f);//rotation z
1133
1134 Vec3 p1 = sv * p1x + uv * p1y - lv * projectToSphere(_radius, p1x, p1y); //start point screen transform to 3d
1135 Vec3 p2 = sv * p2x + uv * p2y - lv * projectToSphere(_radius, p2x, p2y); //end point screen transform to 3d
1136
1137 Vec3::cross(p2, p1, &axis); //calculate rotation axis
1138 axis.normalize();
1139
1140 float t = (p2 - p1).length() / (2.0f * _radius);
1141 //clamp -1 to 1
1142 if (t > 1.0) t = 1.0;
1143 if (t < -1.0) t = -1.0;
1144 angle = asin(t); //rotation angle
1145}
cocos2d::Quaternion _rotationQuat
Definition: Camera3DTest.h:219
float projectToSphere(float r, float x, float y)

引用了 _radius, _rotationQuat , 以及 projectToSphere().

被这些函数引用 onTouchsMoved().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ CREATE_FUNC()

CameraArcBallDemo::CREATE_FUNC ( CameraArcBallDemo  )

◆ onEnter()

void CameraArcBallDemo::onEnter ( )
overridevirtual

重载 TestCase .

在文件 Camera3DTest.cpp1012 行定义.

1013{
1015 _rotationQuat.set(0.0f, 0.0f, 0.0f, 1.0f);
1016 schedule(CC_SCHEDULE_SELECTOR(CameraArcBallDemo::update), 0.0f);
1017 auto s = Director::getInstance()->getWinSize();
1018 auto listener = EventListenerTouchAllAtOnce::create();
1019 listener->onTouchesMoved = CC_CALLBACK_2(CameraArcBallDemo::onTouchsMoved, this);
1020 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
1021
1022 // switch camera
1023 MenuItemFont::setFontName("fonts/arial.ttf");
1024 MenuItemFont::setFontSize(20);
1025
1026 auto menuItem1 = MenuItemFont::create("Switch Operation", CC_CALLBACK_1(CameraArcBallDemo::switchOperateCallback,this));
1027 menuItem1->setColor(Color3B(0,200,20));
1028 auto menuItem2 = MenuItemFont::create("Switch Target", CC_CALLBACK_1(CameraArcBallDemo::switchTargetCallback,this));
1029 menuItem2->setColor(Color3B(0,200,20));
1030 auto menu = Menu::create(menuItem1,menuItem2,NULL);
1031 menu->setPosition(Vec2::ZERO);
1032 menuItem1->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -70);
1033 menuItem2->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -100);
1034 addChild(menu, 1);
1035
1036 auto layer3D=Layer::create();
1037 addChild(layer3D,0);
1038 _layer3D=layer3D;
1039
1040 if (_camera == nullptr)
1041 {
1042 _camera=Camera::createPerspective(60, (float)s.width/s.height, 1, 1000);
1043 _camera->setCameraFlag(CameraFlag::USER1);
1044 _camera->setPosition3D(Vec3(0.0f, 10.0f, 50.0f));
1045 _camera->lookAt(Vec3(0, 0, 0), Vec3(0.0f, 1.0f, 0.0f));
1046 _camera->retain();
1047 _layer3D->addChild(_camera);
1048 }
1049
1050 _sprite3D1 = Sprite3D::create("Sprite3DTest/orc.c3b");
1051 _sprite3D1->setScale(0.5);
1052 _sprite3D1->setRotation3D(Vec3(0.0f,180.0f,0.0f));
1053 _sprite3D1->setPosition3D(Vec3(0,0,0));
1054 _layer3D->addChild(_sprite3D1);
1055
1056 _sprite3D2 = Sprite3D::create("Sprite3DTest/boss.c3b");
1057 _sprite3D2->setScale(0.6f);
1058 _sprite3D2->setRotation3D(Vec3(-90.0f,0.0f,0.0f));
1059 _sprite3D2->setPosition3D(Vec3(20.0f,0.0f,0.0f));
1060 _layer3D->addChild(_sprite3D2);
1061
1063
1064 //draw x
1065 for( int j =-20; j<=20 ;j++)
1066 {
1067 _drawGrid->drawLine(Vec3(-100.0f, 0, 5.0f*j),Vec3(100.0f,0,5.0f*j),Color4F(1,0,0,1));
1068 }
1069 //draw z
1070 for( int j =-20; j<=20 ;j++)
1071 {
1072 _drawGrid->drawLine(Vec3(5.0f*j, 0, -100.0f),Vec3(5.0f*j,0,100.0f),Color4F(0,0,1,1));
1073 }
1074 //draw y
1075 _drawGrid->drawLine(Vec3(0, 0, 0),Vec3(0,50.0f,0),Color4F(0,1,0,1));
1076 _layer3D->addChild(_drawGrid);
1077
1078 _layer3D->setCameraMask(2);
1079
1081
1082}
void onTouchsMoved(const std::vector< cocos2d::Touch * > &touchs, cocos2d::Event *event)
void switchTargetCallback(cocos2d::Ref *sender)
void switchOperateCallback(cocos2d::Ref *sender)
virtual void update(float dt) override
static cocos2d::DrawNode3D * create()
Definition: DrawNode3D.cpp:42
virtual void onEnter() override
Definition: BaseTest.cpp:430
static cocos2d::Vec2 top()
Definition: VisibleRect.cpp:57
static cocos2d::Vec2 left()
Definition: VisibleRect.cpp:45

引用了 _camera, _drawGrid, _layer3D, _rotationQuat, _sprite3D1, _sprite3D2, DrawNode3D::create(), VisibleRect::left(), TestCase::onEnter(), onTouchsMoved(), switchOperateCallback(), switchTargetCallback(), VisibleRect::top(), update() , 以及 updateCameraTransform().

+ 函数调用图:

◆ onExit()

void CameraArcBallDemo::onExit ( )
overridevirtual

在文件 Camera3DTest.cpp1084 行定义.

1085{
1086 CameraBaseTest::onExit();
1087 if (_camera)
1088 {
1089 _camera = nullptr;
1090 }
1091}

引用了 _camera.

◆ onTouchsMoved()

void CameraArcBallDemo::onTouchsMoved ( const std::vector< cocos2d::Touch * > &  touchs,
cocos2d::Event *  event 
)

在文件 Camera3DTest.cpp1093 行定义.

1094{
1095 if (!touchs.empty())
1096 {
1097 if(_operate == OperateCamType::RotateCamera) //arc ball rotate
1098 {
1099 Size visibleSize = Director::getInstance()->getVisibleSize();
1100 Vec2 prelocation = touchs[0]->getPreviousLocationInView();
1101 Vec2 location = touchs[0]->getLocationInView();
1102 location.x = 2.0f * (location.x) / (visibleSize.width) - 1.0f;
1103 location.y = 2.0f * (visibleSize.height - location.y) / (visibleSize.height) - 1.0f;
1104 prelocation.x = 2.0f * (prelocation.x) / (visibleSize.width) - 1.0f;
1105 prelocation.y = 2.0f * (visibleSize.height - prelocation.y) / (visibleSize.height) - 1.0f;
1106
1107 Vec3 axes;
1108 float angle;
1109 calculateArcBall(axes, angle, prelocation.x, prelocation.y, location.x, location.y); //calculate rotation quaternion parameters
1110 Quaternion quat(axes, angle); //get rotation quaternion
1112
1113 updateCameraTransform(); //update camera Transform
1114 }
1115 else if(_operate == OperateCamType::MoveCamera) //camera zoom
1116 {
1117 Point newPos = touchs[0]->getPreviousLocation() - touchs[0]->getLocation();
1118 _distanceZ -= newPos.y*0.1f;
1119
1121 }
1122 }
1123}
void calculateArcBall(cocos2d::Vec3 &axis, float &angle, float p1x, float p1y, float p2x, float p2y)

引用了 _distanceZ, _operate, _rotationQuat, calculateArcBall(), MoveCamera, RotateCamera , 以及 updateCameraTransform().

被这些函数引用 onEnter().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ projectToSphere()

float CameraArcBallDemo::projectToSphere ( float  r,
float  x,
float  y 
)

在文件 Camera3DTest.cpp1149 行定义.

1150{
1151 float d, t, z;
1152 d = sqrt(x*x + y*y);
1153 if (d < r * 0.70710678118654752440)//inside sphere
1154 {
1155 z = sqrt(r*r - d*d);
1156 }
1157 else //on hyperbola
1158 {
1159 t = r / 1.41421356237309504880f;
1160 z = t*t / d;
1161 }
1162 return z;
1163}

被这些函数引用 calculateArcBall().

+ 这是这个函数的调用关系图:

◆ switchOperateCallback()

void CameraArcBallDemo::switchOperateCallback ( cocos2d::Ref *  sender)

在文件 Camera3DTest.cpp1175 行定义.

1176{
1178 {
1180 }
1182 {
1184 }
1185}

引用了 _operate, MoveCamera , 以及 RotateCamera.

被这些函数引用 onEnter().

+ 这是这个函数的调用关系图:

◆ switchTargetCallback()

void CameraArcBallDemo::switchTargetCallback ( cocos2d::Ref *  sender)

在文件 Camera3DTest.cpp1187 行定义.

1188{
1189 if(_target == 0)
1190 {
1191 _target = 1;
1192 _center = _sprite3D2->getPosition3D();
1194 }
1195 else if(_target == 1)
1196 {
1197 _target = 0;
1198 _center = _sprite3D1->getPosition3D();
1200 }
1201}

引用了 _center, _sprite3D1, _sprite3D2, _target , 以及 updateCameraTransform().

被这些函数引用 onEnter().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ title()

std::string CameraArcBallDemo::title ( ) const
overridevirtual

重载 TestCase .

在文件 Camera3DTest.cpp1007 行定义.

1008{
1009 return "Camera ArcBall Moving";
1010}

◆ update()

void CameraArcBallDemo::update ( float  dt)
overridevirtual

在文件 Camera3DTest.cpp1203 行定义.

1204{
1205 //updateCameraTransform();
1206}

被这些函数引用 onEnter().

+ 这是这个函数的调用关系图:

◆ updateCameraTransform()

void CameraArcBallDemo::updateCameraTransform ( )

在文件 Camera3DTest.cpp1165 行定义.

1166{
1167 Mat4 trans, rot, center;
1168 Mat4::createTranslation(Vec3(0.0f, 10.0f, _distanceZ), &trans);
1169 Mat4::createRotation(_rotationQuat, &rot);
1170 Mat4::createTranslation(_center, &center);
1171 Mat4 result = center * rot * trans;
1172 _camera->setNodeToParentTransform(result);
1173}

引用了 _camera, _center, _distanceZ , 以及 _rotationQuat.

被这些函数引用 onEnter(), onTouchsMoved() , 以及 switchTargetCallback().

+ 这是这个函数的调用关系图:

类成员变量说明

◆ _camera

cocos2d::Camera* CameraArcBallDemo::_camera
protected

在文件 Camera3DTest.h217 行定义.

被这些函数引用 onEnter(), onExit() , 以及 updateCameraTransform().

◆ _cameraType

CameraType CameraArcBallDemo::_cameraType
protected

在文件 Camera3DTest.h216 行定义.

◆ _center

cocos2d::Vec3 CameraArcBallDemo::_center
protected

在文件 Camera3DTest.h223 行定义.

被这些函数引用 switchTargetCallback() , 以及 updateCameraTransform().

◆ _distanceZ

float CameraArcBallDemo::_distanceZ
protected

在文件 Camera3DTest.h221 行定义.

被这些函数引用 onTouchsMoved() , 以及 updateCameraTransform().

◆ _drawGrid

cocos2d::DrawNode3D* CameraArcBallDemo::_drawGrid
protected

在文件 Camera3DTest.h218 行定义.

被这些函数引用 onEnter().

◆ _layer3D

cocos2d::Layer* CameraArcBallDemo::_layer3D
protected

在文件 Camera3DTest.h215 行定义.

被这些函数引用 onEnter().

◆ _operate

OperateCamType CameraArcBallDemo::_operate
protected

在文件 Camera3DTest.h222 行定义.

被这些函数引用 onTouchsMoved() , 以及 switchOperateCallback().

◆ _radius

float CameraArcBallDemo::_radius
protected

在文件 Camera3DTest.h220 行定义.

被这些函数引用 calculateArcBall().

◆ _rotationQuat

cocos2d::Quaternion CameraArcBallDemo::_rotationQuat
protected

在文件 Camera3DTest.h219 行定义.

被这些函数引用 calculateArcBall(), onEnter(), onTouchsMoved() , 以及 updateCameraTransform().

◆ _sprite3D1

cocos2d::Sprite3D* CameraArcBallDemo::_sprite3D1
protected

在文件 Camera3DTest.h225 行定义.

被这些函数引用 onEnter() , 以及 switchTargetCallback().

◆ _sprite3D2

cocos2d::Sprite3D* CameraArcBallDemo::_sprite3D2
protected

在文件 Camera3DTest.h226 行定义.

被这些函数引用 onEnter() , 以及 switchTargetCallback().

◆ _target

int CameraArcBallDemo::_target
protected

在文件 Camera3DTest.h224 行定义.

被这些函数引用 switchTargetCallback().


该类的文档由以下文件生成: