查看: 980|回复: 6

viewport = mainCamera->getViewport();//为什么返回空呢?

[复制链接]

该用户从未签到

发表于 2014-11-24 18:45:17 | 显示全部楼层 |阅读模式
#include <Windows.h>
#include <osg/Geode>
#include <osg/Geometry>
#include <osgText/Text>
#include <osgViewer/Viewer>
#include <locale.h>
#include <osgDB/ReadFile>
#include <osg/Shader>  
#include <osg/LineWidth>
#include <osg/StateSet>
#include <osgDB/ConvertUTF>
#include <osg/Camera>
#pragma comment(lib,"OpenThreadsd.lib")
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"osgAPExd.lib")
#pragma comment(lib,"osgGAd.lib")
#pragma comment(lib,"osgUtild.lib")
#pragma comment(lib,"osgTextd.lib")
#pragma comment(lib,"osgSimd.lib")
#pragma comment(lib,"osgViewerd.lib")

int main()
{
        osg::ref_ptr<osg::Group> g_Root = new osg::Group;
        g_Root->addChild(osgDB::readNodeFile("cow.osg"));
        osgViewer::Viewer viewer;
        viewer.setSceneData(g_Root);  
        osg::Camera* mainCamera = viewer.getCamera();
        osg::Viewport* viewport;
        if (!mainCamera) {
                return FALSE;
        }
        viewport = mainCamera->getViewport();
        if (!viewport) {
                return FALSE;
        }

        float xOrigin,yOrigin,width,height;
        xOrigin = viewport->x();
        yOrigin = viewport->y();
        width = viewport->width();
        height = viewport->height();
        viewer.run();
}

该用户从未签到

发表于 2014-11-26 13:57:38 | 显示全部楼层
viewer只是视景器类,并没有建立窗口,需要建立窗口后才能得到视口,把获取视口的那段代码放到viewer.realize()后面即可

该用户从未签到

 楼主| 发表于 2014-11-26 14:20:50 | 显示全部楼层
buaahc 发表于 2014-11-26 13:57
viewer只是视景器类,并没有建立窗口,需要建立窗口后才能得到视口,把获取视口的那段代码放到viewer.reali ...


  1. 已知俩点进行旋转 pC是什么意思呢.....


  2. pA.set(event.getX(0), event.getY(0));  
  3. pB.set(event.getX(1), event.getY(1));  

  4. PointF pC = new PointF(event.getX(1) - event.getX(0) + pA.x,  
  5.                         event.getY(1) - event.getY(0) + pA.y);            

  6. double a = spacing(pB.x, pB.y, pC.x, pC.y);  
  7. double b = spacing(pA.x, pA.y, pC.x, pC.y);  
  8. double c = spacing(pA.x, pA.y, pB.x, pB.y);  
  9. double cosB = (a * a + c * c - b * b) / (2 * a * c);  
  10. double angleB = Math.acos(cosB);  
  11. double PID4 = Math.PI / 4;  

  12. if (angleB > PID4 && angleB < 3 * PID4) {  
  13.                         mode = ROTATE;  
  14.                         
  15.    } else {  
  16.                         mode = ZOOM;
复制代码

该用户从未签到

发表于 2014-11-26 14:43:21 | 显示全部楼层
event是什么?getx(0)?

该用户从未签到

 楼主| 发表于 2014-11-27 11:26:14 | 显示全部楼层
本帖最后由 颂鼎 于 2014-11-27 13:03 编辑
buaahc 发表于 2014-11-26 14:43
event是什么?getx(0)?


pA是原点 pB是开始转之前的坐标  pC就是进行中旋转的坐标

手机手指旋转

食指固定 坐标 (x1,y1)
中指转 转前坐标 (x2,y2) 转后坐标 (x3,y3)

这三组坐标是 已知的

该用户从未签到

 楼主| 发表于 2014-11-27 13:04:18 | 显示全部楼层
buaahc 发表于 2014-11-26 14:43
event是什么?getx(0)?

哥们为什么字体俩个不同shader渲染 会是最后一次shader渲染的颜色呢???


  1. #include "stdafx.h"
  2. #include <osg/Geode>
  3. #include <osg/Geometry>
  4. #include <osgText/Text>
  5. #include <osgViewer/Viewer>
  6. #include <locale.h>
  7. #include <osgDB/ReadFile>
  8. #include <osg/Shader>  
  9. #include <osg/LineWidth>
  10. #include <osg/StateSet>
  11. #include <osgDB/ConvertUTF>
  12. #include <osg/Camera>
  13. #pragma comment(lib,"OpenThreadsd.lib")
  14. #pragma comment(lib,"osgd.lib")
  15. #pragma comment(lib,"osgDBd.lib")
  16. #pragma comment(lib,"osgAPExd.lib")
  17. #pragma comment(lib,"osgGAd.lib")
  18. #pragma comment(lib,"osgUtild.lib")
  19. #pragma comment(lib,"osgTextd.lib")
  20. #pragma comment(lib,"osgSimd.lib")
  21. #pragma comment(lib,"osgViewerd.lib")

  22. static const char vertSource10[] =
  23. "varying vec2 texcoord1;             \n"
  24. "varying vec4 VertexColor; \n"
  25. "uniform vec4 color; \n"
  26. "void main()                                                \n"
  27. "{                                                                        \n"
  28. "   VertexColor = color;      \n"
  29. "        texcoord1 = gl_MultiTexCoord0.st ;\n"
  30. "        gl_Position = ftransform();            \n"
  31. "}                                                                        \n";



  32. static  const char fragSource10[] =
  33. "varying vec4 VertexColor; \n"
  34. "uniform  vec4 color;                      \n"
  35. "varying  vec2 texcoord1;                  \n"
  36. "uniform sampler2D sampler1;                                       \n"
  37. "void main() {                                    \n"
  38. "  gl_FragColor = VertexColor *texture2D(sampler1,texcoord1).aaaa;  \n"
  39. "}                                              \n";


  40. static const char vertSource11[] =
  41. "varying vec2 texcoord1;             \n"

  42. "void main()                                                \n"
  43. "{                                                                        \n"
  44. "        texcoord1 = gl_MultiTexCoord0.st ;\n"
  45. "        gl_Position = ftransform();            \n"
  46. "}                                                                        \n";



  47. static  const char fragSource11[] =
  48. "varying vec4 VertexColor; \n"
  49. "uniform  vec4 color2;                      \n"
  50. "varying  vec2 texcoord1;                  \n"
  51. "uniform sampler2D sampler1;                                       \n"
  52. "void main() {                                    \n"
  53. "  gl_FragColor = color2 *texture2D(sampler1,texcoord1).aaaa;  \n"
  54. "}                                              \n";

  55. osg::Node* createHUD()
  56. {
  57.         //文字

  58.         osgText::Text* text = new osgText::Text;

  59.         //设置字体

  60.         std::string caiyun("simhei.ttf");//此处设置的是汉字字体

  61.         text->setFont(caiyun);

  62.         //设置文字显示的位置

  63.         osg::Vec3 position(150.0f,500.0f,0.0f);

  64.         text->setPosition(position);   

  65.         //text->setColor( osg::Vec4( 1, 0, 0, 1));

  66.         text->setText(L"osg中国官网网站");//设置显示的文字


  67.         osgText::Text* text2 = new osgText::Text;

  68.         //设置字体

  69.         std::string caiyun2("simhei.ttf");//此处设置的是汉字字体

  70.         text2->setFont(caiyun2);

  71.         //设置文字显示的位置

  72.         osg::Vec3 position2(150.0f,300.0f,0.0f);

  73.         text2->setPosition(position2);   

  74.         //text->setColor( osg::Vec4( 1, 0, 0, 1));

  75.         text2->setText(L"osg外国官网网站");//设置显示的文字
  76.         //几何体节点

  77.         osg::Geode* geode = new osg::Geode();
  78.         osg::Geode* geode2 = new osg::Geode();
  79.         geode->addDrawable( text );//将文字Text作这drawable加入到Geode节点中
  80.         geode2->addDrawable( text2 );//将文字Text作这drawable加入到Geode节点中
  81.        
  82.         osg::Drawable* geom3 = geode->getDrawable(0);
  83.         osg::StateSet * ss3 = geom3->getOrCreateStateSet();//->getStateSet();
  84.         osg::Program * program3 = new osg::Program;
  85.         program3->addShader(new osg::Shader(osg::Shader::FRAGMENT,fragSource10));
  86.         program3->addShader(new osg::Shader(osg::Shader::VERTEX,vertSource10));
  87.         osg::ref_ptr<osg::Uniform> textColor = new osg::Uniform("color",osg::Vec4(1,0,1,1));
  88.         osg::ref_ptr<osg::Uniform> textTexture = new osg::Uniform("sampler1",0);
  89.         ss3->addUniform(textColor);
  90.         ss3->addUniform(textTexture);
  91.         ss3->setAttribute(program3);

  92.         osg::Drawable* geom = geode2->getDrawable(0);
  93.         osg::StateSet * ss = geom->getOrCreateStateSet();//->getStateSet();
  94.         osg::Program * program = new osg::Program;
  95.         program->addShader(new osg::Shader(osg::Shader::FRAGMENT,fragSource11));
  96.         program->addShader(new osg::Shader(osg::Shader::VERTEX,vertSource11));
  97.         osg::ref_ptr<osg::Uniform> textColor2 = new osg::Uniform("color2",osg::Vec4(0,0,1,1));
  98.         osg::ref_ptr<osg::Uniform> textTexture2 = new osg::Uniform("sampler1",0);
  99.         ss->addUniform(textColor2);
  100.         ss->addUniform(textTexture2);
  101.         ss->setAttribute(program);

  102.         //相机
  103.         osg::Camera *hud = new osg::Camera();
  104.         if (hud)
  105.         {
  106.                 hud->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::PROTECTED|osg::StateAttribute::OFF);
  107.                 hud->setProjectionMatrix(osg::Matrix::ortho2D(0,600,0,600));
  108.                 hud->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  109.                 hud->setViewMatrix(osg::Matrix::identity());
  110.                 hud->setClearMask(GL_DEPTH_BUFFER_BIT);
  111.                 hud->setRenderOrder(osg::Camera::POST_RENDER);
  112.                 hud->setDataVariance(osg::Object::DYNAMIC);
  113.                 hud->setAllowEventFocus(false);
  114.                 hud->addChild(geode);
  115.                 hud->addChild(geode2);
  116.         }
  117.         return hud;
  118. };





  119. int main( int argc, char **argv){
  120.         osgViewer::Viewer viewer;
  121.         //osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("fountain.osg");

  122.         osg::ref_ptr<osg::Group> root= new osg::Group;
  123.         //root->addChild( model.get());//加入某个模型
  124.         root->addChild(createHUD());//把HUD文字的相机加入到根节点下

  125.         viewer.setSceneData( root.get());
  126.         viewer.realize();
  127.         viewer.run() ;  
  128.         return 0;
  129. }
复制代码

该用户从未签到

发表于 2014-11-27 14:00:58 | 显示全部楼层
shader设置给geode
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表