其实,半透明也简单,一开始和折射率混淆了,折射是偏移光线直线传播的程度,比如,玻璃窗就可以认为没有折射,而玻璃杯是有折射。
投射还是要看alpha值,移植到osg时,只要加上alpha值,再设置alpha混合就可以了。如下图所示

代码如下:
Travel.h
#pragma once
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventAdapter>
#include <osgViewer/ViewerEventHandlers>
#include <osg/AnimationPath>
#include
#include <osg/PositionAttitudeTransform>
#include <osg/MatrixTransform>
#include <osgGA/CameraManipulator>
#include <osg/matrixd>
class TravelManipulator : public osgGA::CameraManipulator
{
public:
TravelManipulator();
public:
//设置当前视口
virtual void setByMatrix(const osg::Matrixd& matrix);
virtual void setByInverseMatrix(const osg::Matrixd& matrix);
//得到当前矩阵和逆矩阵
virtual osg::Matrixd getMatrix() const;
virtual osg::Matrixd getInverseMatrix() const;
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us);
void ChangePosition(osg::Vec3d& delta);
private:
//视点
osg::Vec3 m_vPosition;
//朝向
osg::Vec3 m_vRotation;
//移动步长
int m_vStep;
//旋转步长
float m_vRotateSpeed;
//暂停
bool _bPause;
public:
//设置视点位置到shader
void setEyePosUniform(osg::ref_ptrosg::Uniform camearaPosUniform);
//
osg::ref_ptrosg::Uniform _eyePosUniform;
};
Travel.cpp
#include “Travel.h”
TravelManipulator::TravelManipulator()
{
m_vPosition = osg::Vec3(0, 0, 50);
m_vRotation = osg::Vec3(osg::PI_2, 0, 0);
m_vStep = 1.0;
m_vRotateSpeed = 1.0;
_bPause = false;
_eyePosUniform = NULL;
}
void TravelManipulator::setByMatrix(const osg::Matrixd & matrix)
{
}
void TravelManipulator::setByInverseMatrix(const osg::Matrixd & matrix)
{
}
osg::Matrixd TravelManipulator::getMatrix() const
{
osg::Matrixd matTrans;
matTrans.makeTranslate(m_vPosition);
osg::Matrixd matRotate;
matRotate.makeRotate(m_vRotation[0], osg::X_AXIS, m_vRotation[1], osg::Y_AXIS, m_vRotation[2], osg::Z_AXIS);
return matRotate * matTrans;
}
osg::Matrixd TravelManipulator::getInverseMatrix() const
{
osg::Matrixd mat = getMatrix();
return osg::Matrixd::inverse(mat);
}
bool TravelManipulator::handle(const osgGA::GUIEventAdapter & ea, osgGA::GUIActionAdapter & us)
{
switch (ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
{
//if (ea.getKey() ==‘p’)
//{
// _bPause = !_bPause;
//}
//if (_bPause)
{
if ((ea.getKey() == ‘w’) || (ea.getKey() == ‘W’))
{
ChangePosition(osg::Vec3d(m_vStep * cosf(osg::PI_2 + m_vRotation._v[2]), m_vStep * sinf(osg::PI_2 + m_vRotation._v[2]), 0));
return true;
}
else if ((ea.getKey() == ‘s’) || (ea.getKey() == ‘S’))
{
ChangePosition(osg::Vec3d(-m_vStep * cosf(osg::PI_2 + m_vRotation._v[2]), -m_vStep * sinf(osg::PI_2 + m_vRotation._v[2]), 0));
return true;
}
else if ((ea.getKey() == ‘a’) || (ea.getKey() == ‘A’))
{
ChangePosition(osg::Vec3d(m_vStep * sinf(osg::PI_2 + m_vRotation._v[2]), -m_vStep * cosf(osg::PI_2 + m_vRotation._v[2]), 0));
return true;
}
else if ((ea.getKey() == ‘d’) || (ea.getKey() == ‘D’))
{
ChangePosition(osg::Vec3d(-m_vStep * sinf(osg::PI_2 + m_vRotation._v[2]), m_vStep * cosf(osg::PI_2 + m_vRot

最低0.47元/天 解锁文章
1420

被折叠的 条评论
为什么被折叠?



