当前位置: 首页 > wzjs >正文

中国建设银行官网站周波网站系统使用说明书

中国建设银行官网站周波,网站系统使用说明书,网络广告创意策划,黄页网络的推广网站有哪些好前言 在VSG(Vulkan Scene Graph)中,系统支持用户通过鼠标或触摸输入与三维场景进行交互,从而动态控制相机的位置和姿态,实现与三维场景的交互。VSG提供了多种相机操纵器,其中Trackball是一种常见的相机操作…

 前言

      在VSG(Vulkan Scene Graph)中,系统支持用户通过鼠标或触摸输入与三维场景进行交互,从而动态控制相机的位置和姿态,实现与三维场景的交互。VSG提供了多种相机操纵器,其中Trackball是一种常见的相机操作器,模拟了一个虚拟的轨迹球,用户可拖动鼠标来旋转、平移和缩放场景。机操纵器的本质是通过用户交互动态修改视图矩阵,从而改变模型在视口中的显示效果。本章探讨对事件的封装vsg::UIEvent,以此作为基础,将深入探讨vsg::trackball的实现原理,重点剖析旋转、平移和缩放三大操作的内部逻辑。


目录

  • 1 vsg::UIEvent的封装
  • 2 vsg::Trackball实现原理

       本章为参照用例(vulkanscenegraph显示倾斜模型-CSDN博客)中的如下代码进行深入探讨。

		vsg_viewer->addEventHandler(vsg::Trackball::create(vsg_camera));

1 vsg::Event的封装

   vsg::UIEvent继承自vsg::Object,其下共有三种类型的子类:vsg::FrameEvent、vsg::TerminateEvent和vsg::WindowEvent,分别对应帧循环消息、程序或渲染终止消息以及窗口事件。

      在5.1章中,介绍了窗口的创建,在windows系统下,创建的窗口对象为vsg::Win32_Window。vsg::Window_Window通过函数handleWin32Messages处理系统消息,并将消息封装为vsg::UIEvent对象。

   handleWin32Messages函数在vsg::Window_Window对象构造的过程中通过外部的函数Win32WindowProc与WNDCLASSEX::lpfnWndProc绑定,如下代码所示:    

    LRESULT CALLBACK Win32WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){Win32_Window* win = reinterpret_cast<Win32_Window*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));if (win != nullptr){
#if 1// return if vsg::Win32_Window is able to handle it, otherwise fallback to the ::DefWindowProc(..) belowif (win->handleWin32Messages(msg, wParam, lParam)) return 0;
#elsewin->handleWin32Messages(msg, wParam, lParam);
#endif}return ::DefWindowProc(hwnd, msg, wParam, lParam);}
        WNDCLASSEX wc;wc.cbSize = sizeof(WNDCLASSEX);wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;wc.lpfnWndProc = Win32WindowProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = ::GetModuleHandle(NULL);wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = 0;wc.lpszMenuName = 0;wc.lpszClassName = windowClass.c_str();wc.hIconSm = 0;

      在vsg的渲染帧循环中(后续章节会深入探究),调用vsg::Window_Window对象的pollEvents函数取出所有的事件,并在视景器vsg::Viewer的handleEvents函数中处理所有事件。

void Viewer::handleEvents()
{CPU_INSTRUMENTATION_L1_NC(instrumentation, "Viewer handle events", COLOR_UPDATE);for (auto& vsg_event : _events){for (auto& handler : _eventHandlers){vsg_event->accept(*handler);}}
}

2 vsg::Trackball实现原理

   vsg::Trackball继承自vsg::Visitor,通过重写apply(ButtonPressEvent& buttonPress)、apply(ButtonReleaseEvent& buttonRelease)、apply(MoveEvent& moveEvent)函数,实现对通过鼠标交互实现旋转、平移和缩放三大操作的处理。默认鼠标中键平移、鼠标滚轮缩放、鼠标左键拖动实现旋转,本章重点探讨旋转操作。

        _updateMode = ROTATE;moveEvent.handled = true;dvec3 xp = cross(normalize(control_tbc), normalize(prev_tbc));double xp_len = length(xp);if (xp_len > 0.0){_rotateAngle = asin(xp_len);_rotateAxis = xp / xp_len;rotate(_rotateAngle * scale, _rotateAxis);}else{_rotateAngle = 0.0;}

     在Trackball::apply(MoveEvent& moveEvent)方法中,场景旋转的具体实现如下:prev_tbc表示鼠标左键点击时(即旋转操作开始时)对应的TBC(Trackball Coordinate)坐标,而control_tbc则表示当前鼠标位置对应的TBC坐标。通过计算这两个坐标之间的公垂线xp,将其作为旋转轴,同时以公垂线的长度作为旋转角度,从而实现场景的旋转操作。

     其中有鼠标所在屏幕坐标计算得到TBC坐标的代码如下,其中ndc函数为取值范围为[0,1]的归一化屏幕坐标系。

dvec3 Trackball::tbc(const PointerEvent& event)
{dvec2 v = ndc(event);double l = length(v);if (l < 1.0f){double h = 0.5 + cos(l * PI) * 0.5;return dvec3(v.x, -v.y, h);}else{return dvec3(v.x, -v.y, 0.0);}
}

     旋转函数rotate具体实现如下:

void Trackball::rotate(double angle, const dvec3& axis)
{dmat4 rotation = vsg::rotate(angle, axis);dmat4 lv = lookAt(_lookAt->eye, _lookAt->center, _lookAt->up);dvec3 centerEyeSpace = (lv * _lookAt->center);dmat4 matrix = inverse(lv) * translate(centerEyeSpace) * rotation * translate(-centerEyeSpace) * lv;_lookAt->up = normalize(matrix * (_lookAt->eye + _lookAt->up) - matrix * _lookAt->eye);_lookAt->center = matrix * _lookAt->center;_lookAt->eye = matrix * _lookAt->eye;clampToGlobe();
}

      通过给定的旋转角度(angle)和旋转轴(axis)对相机上方(up)、观察点(center)、相机点(eye),实现视图矩阵的更新。

文末:本章在上一篇文章的基础上,进一步深入相机操作器,机操纵器的本质是通过用户交互动态修改视图矩阵,从而改变模型在视口中的显示效果。重点分析了vsg中针对事件vsg::UIEvent的封装、vsg::Trackball中轨迹球旋转的具体实现。下章将分析视景器准备过程中的CommandGraph的创建过程。


文章转载自:

http://l8o5lNSN.qbxdt.cn
http://ikXnklHp.qbxdt.cn
http://qeLbV9Lv.qbxdt.cn
http://BNCk4CmA.qbxdt.cn
http://3vrhMFOj.qbxdt.cn
http://bvBPC1hn.qbxdt.cn
http://fTUTevz5.qbxdt.cn
http://YaZoNfgB.qbxdt.cn
http://RbyYkRop.qbxdt.cn
http://2o884qOA.qbxdt.cn
http://SGBqd3WH.qbxdt.cn
http://iGI03LKk.qbxdt.cn
http://oLQiNzF9.qbxdt.cn
http://6G2AokMH.qbxdt.cn
http://KidCrwwt.qbxdt.cn
http://CvVFUjeE.qbxdt.cn
http://5nAantIJ.qbxdt.cn
http://0Wmgt0Ok.qbxdt.cn
http://bWHW9KcS.qbxdt.cn
http://Bq59yLcF.qbxdt.cn
http://vZDoCv7q.qbxdt.cn
http://UQheFXvQ.qbxdt.cn
http://McZL4ZvQ.qbxdt.cn
http://aR4ZCeOY.qbxdt.cn
http://pyWmmzK4.qbxdt.cn
http://BlIfSOBr.qbxdt.cn
http://VazeiYtl.qbxdt.cn
http://zu8MPXWa.qbxdt.cn
http://xbe0adbn.qbxdt.cn
http://4JR5xRE8.qbxdt.cn
http://www.dtcms.com/wzjs/700458.html

相关文章:

  • 做网站编辑好还是美工好网站里的横幅怎么做
  • 网站建设一般多少个板块龙岗做网站多少钱
  • 南京市建设工程交易中心网站it运维多少钱一个月
  • 我想用c 来做网站现在推广引流什么平台比较火
  • 免费简历模板的网站外贸商城网站 定制
  • 深圳官网网站建设个人电脑做网站打不开数据库
  • 个人建购物网站怎么备案公司名称变更说明函
  • 做ps合成的网站上海黄浦 网站建设
  • 做网站能赚钱吗表情包科技有限公司注册
  • 自己网站的关键词怎么改网站关键词符号
  • 怎么查看网站死链接沈阳手机网站
  • 网站运营专员做什么惠州做网站优化
  • 做网站网上怎么挂公告wordpress实现专题
  • 兴安盟网站建设wordpress缓存类
  • 企业营销型网站规划网站开发需求方案模板
  • 网站开发实践意义wordpress 自定义结构 标题
  • 做刷单的网站点击图片进入网站要怎么做
  • 公司品牌网站设计河南企业建站系统信息
  • 网站建设四网合一网站的建设费用预算策划书
  • 宁波网站建设速成东莞网站制作网站
  • 自己做网站难吗网站开发价格 北京
  • 网站推广中应注意哪些事项专业免费网站建设一般多少钱
  • 免费网站空间怎么办有的网站打不开是什么原因呢
  • 广州网站排名163邮箱 wordpress
  • 电商网站流程图wordpress 发布到iis
  • 企业网站管理系统联系我们怎么添加广州优化网站推广
  • 网站案例上海短视频剪辑自学
  • 方案库网站网站域名怎么买
  • 注册网站空间哪些做园林的网站
  • 有什么做兼职的好网站房地产公司网站 源码