osgOceanノート
2488 ワード
1.osgでアンチエイリアシングを設定する方法
このコードはosgviewerMFCでは機能せず、traits->samples=16を直接設定します.
ウィンドウの初期化時にtraits->samples=16を設定します.ルートノードは次のように設定されています.
シミュレーションサイクルを開始する前にDisplaySettings::instance()->setNumMultiSamples()
2.裁断面の問題
osgではデフォルトでは裁断面の自動計算が行われています.つまり、s e t P r o jectionMatrixAsPerspective関数で最後に2つのパラメータを設定するのは無効です.CameraクラスのsetComputeNearFarMode関数設定を使用しない限り、自動的に計算されません.
viewer.getCamera()->setComputeNearFarMode(osg::Camera:DO_NOT_COMPUTE_NEAR_FAR);この行のコードを使用すると、setProjectionMatrixAsPerspectiveで最後に設定した2つのパラメータが有効になります.
自動計算トリムを使用せずに自分で手動で設定する場合
setNearFarRatio()は、近剪断面が遠すぎるという問題を解決し、カメラのsetComputeNearFarMode(COMPUTE_NEAR_FAR_USING_PRIMITIVES)を設定することで、ジッタ問題(Z-fighting)を解決します.
3.マウスホイールメッセージ
4.カスタムローミングマシンTravelManipulatorを統合OSGのMFCエンジニアリングに追加するとプログラム終了時にエラーが発生する可能性がありますが、コンソールの下でローミングマシンを使用しても問題ありません.これは統合OSGのMFCエンジニアリングの例でm_viewerはスマートポインタではなく一般的なC++ポインタを使用します.
ヘッダファイルでosgViewer::Viewer*m_viewer;
osgに変更::ref_ptrm_viewer;
CoreOSGの解析関数でdelete m_viewer;この行のコードは注釈すればいいです.OSGではスマートポインタを使用することが望ましいが,C++のポインタを使用しないことで,多くの問題を回避できる.
5.MFCベースのosgエンジニアリングでは、ボタン応答イベントでシーンに既に存在するノードに更新コールバックを追加できないようです.更新コールバックは、シーンにノード(ダイナミックでも静的でも)を追加する場合にのみ追加できますが、1つの制御量で更新コールバックがすぐに機能しないように適切な場所で機能することができます.他のコールバックタイプはテストされていませんが、この問題に注意する必要があります.
osg:DisplaySettings* ds = osg:DisplaySettings::instance();
ds->setNumMultiSamples(16);
mViewer->setDisplaySettings(ds);
このコードはosgviewerMFCでは機能せず、traits->samples=16を直接設定します.
ウィンドウの初期化時にtraits->samples=16を設定します.ルートノードは次のように設定されています.
osg::Multisample* pms=new osg::Multisample;
pms->setSampleCoverage(1,true);
mRoot->getOrCreateStateSet()->setAttributeAndModes(pms,osg::StateAttribute::ON);
では、mRootノードの下の子供は、インポートしたosgモデルを含むアンチエイリアシング効果を有します.シミュレーションサイクルを開始する前にDisplaySettings::instance()->setNumMultiSamples()
2.裁断面の問題
osgではデフォルトでは裁断面の自動計算が行われています.つまり、s e t P r o jectionMatrixAsPerspective関数で最後に2つのパラメータを設定するのは無効です.CameraクラスのsetComputeNearFarMode関数設定を使用しない限り、自動的に計算されません.
viewer.getCamera()->setComputeNearFarMode(osg::Camera:DO_NOT_COMPUTE_NEAR_FAR);この行のコードを使用すると、setProjectionMatrixAsPerspectiveで最後に設定した2つのパラメータが有効になります.
自動計算トリムを使用せずに自分で手動で設定する場合
setNearFarRatio()は、近剪断面が遠すぎるという問題を解決し、カメラのsetComputeNearFarMode(COMPUTE_NEAR_FAR_USING_PRIMITIVES)を設定することで、ジッタ問題(Z-fighting)を解決します.
3.マウスホイールメッセージ
case(osgGA::GUIEventAdapter::SCROLL):
{
switch(ea.getScrollingMotion())
{
case(osgGA::GUIEventAdapter::SCROLL_UP):
{
return true;
}
case(osgGA::GUIEventAdapter::SCROLL_DOWN):
{
m_vDistance-=osg::Vec3(0.0f,0.0f,100.0f);
return true;
}
default:
break;
}
returnfalse;
}
4.カスタムローミングマシンTravelManipulatorを統合OSGのMFCエンジニアリングに追加するとプログラム終了時にエラーが発生する可能性がありますが、コンソールの下でローミングマシンを使用しても問題ありません.これは統合OSGのMFCエンジニアリングの例でm_viewerはスマートポインタではなく一般的なC++ポインタを使用します.
ヘッダファイルでosgViewer::Viewer*m_viewer;
osgに変更::ref_ptr
CoreOSGの解析関数でdelete m_viewer;この行のコードは注釈すればいいです.OSGではスマートポインタを使用することが望ましいが,C++のポインタを使用しないことで,多くの問題を回避できる.
5.MFCベースのosgエンジニアリングでは、ボタン応答イベントでシーンに既に存在するノードに更新コールバックを追加できないようです.更新コールバックは、シーンにノード(ダイナミックでも静的でも)を追加する場合にのみ追加できますが、1つの制御量で更新コールバックがすぐに機能しないように適切な場所で機能することができます.他のコールバックタイプはテストされていませんが、この問題に注意する必要があります.