mofify cone to remove warning

This commit is contained in:
brige 2025-07-03 07:53:32 +08:00
parent 9cf724588a
commit eba320eaeb
3 changed files with 18 additions and 69 deletions

View File

@ -21,14 +21,12 @@ public:
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
timeElapsed += (nv->getFrameStamp()->getSimulationTime() - SimulationTime);
// 获取并更新geometry的顶点
osg::Geode* geode = dynamic_cast<osg::Geode*>(node);
if (geode) {
osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(geode->getDrawable(0));
if (geometry) {
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray());
if (vertices) {
// 更新顶点位置来模拟波动
float amplitude = 2.0f;
float frequency = 1.0f;
for (unsigned int i = 0; i < vertices->size(); ++i) {
@ -36,12 +34,11 @@ public:
vertex.z() = amplitude * sin(frequency * (vertex.x() + timeElapsed));
}
geometry->setVertexArray(vertices);
geometry->dirtyBound(); // 更新几何体边界
geometry->dirtyBound();
}
}
}
// 继续遍历场景图
traverse(node, nv);
SimulationTime = nv->getFrameStamp()->getSimulationTime();
}
@ -51,7 +48,6 @@ private:
double SimulationTime;
};
// 雷达扫描波时间更新回调
class RadarWaveTimeCallback : public osg::NodeCallback {
public:
RadarWaveTimeCallback(osg::ref_ptr<osg::Uniform> waveTimeUniform)
@ -64,16 +60,13 @@ public:
startTime_ = currentTime;
}
// 计算经过的时间
float elapsedTime = static_cast<float>(currentTime - startTime_);
// 更新waveTime uniform
if (waveTimeUniform_.valid()) {
waveTimeUniform_->set(elapsedTime);
}
}
// 继续遍历场景图
traverse(node, nv);
}
@ -87,7 +80,6 @@ ConeWave::ConeWave() {
osgEarth::Registry::shaderGenerator().run(this);
currentTime_ = 0.0;
// 确保成员变量有合理的默认值
height_ = 1000.0f;
radius_ = 50.0f;
waveRadius_ = 100.0f;
@ -96,7 +88,6 @@ ConeWave::ConeWave() {
baseColor_ = osg::Vec4(0.0f, 0.8f, 1.0f, 1.0f);
waveColor_ = osg::Vec4(1.0f, 0.5f, 1.0f, 0.8f);
// 初始化透明度值
ringBrightAlpha_ = 0.8f;
ringDarkAlpha_ = 0.3f;
coneAlpha_ = 0.7f;
@ -108,8 +99,6 @@ ConeWave::~ConeWave(void)
}
void ConeWave::Render(double dt) {
// 时间更新现在由RadarWaveTimeCallback回调处理
// 这里可以处理其他需要更新的属性
}
void ConeWave::InitGeode() {
@ -142,11 +131,9 @@ void ConeWave::SetBaseColor(const osg::Vec4& color) {
void ConeWave::SetWaveCount(int count) {
waveCount_ = count;
// 如果uniform已经存在直接更新值
if (waveCountUniform_.valid()) {
waveCountUniform_->set(static_cast<float>(waveCount_));
} else {
// 否则重建整个几何体和着色器
Rebuild();
}
}
@ -159,10 +146,9 @@ void ConeWave::SetWaveSpeed(float speed) {
}
}
// 雷达扫描波效果相关方法实现
void ConeWave::SetWaveRadius(float radius) {
waveRadius_ = radius;
radius_ = radius; // 同时更新锥形的半径
radius_ = radius;
Rebuild();
}
@ -174,7 +160,6 @@ void ConeWave::SetWaveColor(const osg::Vec4& color) {
}
}
// 透明度控制方法实现
void ConeWave::SetRingBrightAlpha(float alpha) {
ringBrightAlpha_ = alpha;
@ -192,11 +177,7 @@ void ConeWave::SetRingDarkAlpha(float alpha) {
void ConeWave::SetConeAlpha(float alpha) {
coneAlpha_ = alpha;
// 更新锥形的基础颜色透明度
if (coneGeometry_.valid()) {
// 通过着色器uniform来控制透明度而不是直接设置颜色
// 这里可以在CreateRadarShader中添加coneAlpha uniform来控制
// 或者通过StateSet的材质属性来控制
osg::StateSet* ss = coneGeometry_->getOrCreateStateSet();
osg::ref_ptr<osg::Material> material = new osg::Material();
material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0f, 0.8f, 1.0f, alpha));
@ -206,9 +187,8 @@ void ConeWave::SetConeAlpha(float alpha) {
}
void ConeWave::Clear() {
// 清除锥形几何体和相关uniform
if (coneCallback_.valid()) {
setUpdateCallback(nullptr); // 移除时间更新回调
setUpdateCallback(nullptr);
coneCallback_ = nullptr;
}
@ -228,31 +208,25 @@ void ConeWave::Clear() {
}
void ConeWave::Rebuild() {
// 清除当前几何体和uniform
Clear();
CreateRadarScanWave();
}
void ConeWave::CreateConeGeometry() {
// 创建锥形几何体
osg::ref_ptr<osg::Geometry> coneGeometry = new osg::Geometry();
// 锥形参数
const int segments = 64; // 圆周细分数
const int segments = 64;
const float angleStep = 2.0f * osg::PI / segments;
// 创建顶点数组
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array();
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array();
osg::ref_ptr<osg::Vec2Array> texCoords = new osg::Vec2Array();
// 锥顶(位于原点)
vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
normals->push_back(osg::Vec3(0.0f, 0.0f, -1.0f));
texCoords->push_back(osg::Vec2(0.5f, 0.5f));
// 底面圆周顶点位于height_高度处
for (int i = 0; i <= segments; ++i) {
float angle = i * angleStep;
float x = radius_ * cos(angle);
@ -261,12 +235,10 @@ void ConeWave::CreateConeGeometry() {
vertices->push_back(osg::Vec3(x, y, z));
// 计算法线(从锥顶指向圆周的单位向量)
osg::Vec3 normal(x, y, radius_);
normal.normalize();
normals->push_back(normal);
// 纹理坐标
texCoords->push_back(osg::Vec2((x/radius_ + 1.0f) * 0.5f, (y/radius_ + 1.0f) * 0.5f));
}
@ -275,15 +247,12 @@ void ConeWave::CreateConeGeometry() {
coneGeometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
coneGeometry->setTexCoordArray(0, texCoords);
// 创建三角形索引
osg::ref_ptr<osg::DrawElementsUInt> indices = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES);
// 生成锥面三角形
for (int i = 0; i < segments; ++i) {
// 每个三角形:锥顶 -> 底面点i -> 底面点i+1
indices->push_back(0); // 锥顶
indices->push_back(i + 1); // 底面点i
indices->push_back(i + 2); // 底面点i+1
indices->push_back(0);
indices->push_back(i + 1);
indices->push_back(i + 2);
}
coneGeometry->addPrimitiveSet(indices);
@ -301,41 +270,33 @@ void ConeWave::CreateConeGeometry() {
}
void ConeWave::CreateRadarScanWave() {
// 手动创建锥形几何体
CreateConeGeometry();
// 添加到几何节点
addDrawable(coneDrawable_);
// 设置渲染状态
osg::StateSet* ss = coneDrawable_->getOrCreateStateSet();
ss->setRenderBinDetails(120, "RenderBin");
ss->setMode(GL_CULL_FACE, osg::StateAttribute::OFF); // 关闭面剔除以确保可见
ss->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
// 设置混合模式
osg::ref_ptr<osg::BlendFunc> bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA);
ss->setAttributeAndModes(bf, osg::StateAttribute::ON);
ss->setMode(GL_BLEND, osg::StateAttribute::ON);
ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
ss->setAttributeAndModes(new osg::CullFace(osg::CullFace::BACK));
// 创建雷达扫描波着色器
CreateRadarShader();
// 添加时间更新回调
osg::ref_ptr<osg::NodeCallback> waveTimeCallback = new RadarWaveTimeCallback(waveTimeUniform_);
coneCallback_ = waveTimeCallback;
setUpdateCallback(coneCallback_);
}
void ConeWave::CreateRadarShader() {
// 防止重复创建着色器
if (waveTimeUniform_.valid()) {
return;
}
// 顶点着色器 - 使用简单的基于高度的条纹效果
static const char* vertexShaderSource =
"varying vec3 pos;\n"
"void main()\n"
@ -346,7 +307,6 @@ void ConeWave::CreateRadarShader() {
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
"}\n";
// 片段着色器 - 可控透明度的同心圆波纹效果
static const char* fragmentShaderSource =
"uniform float height;\n"
"uniform vec4 baseColor;\n"
@ -377,7 +337,6 @@ void ConeWave::CreateRadarShader() {
" }\n"
"}\n";
// 创建着色器
osg::ref_ptr<osg::Shader> vertexShader = new osg::Shader(osg::Shader::VERTEX, vertexShaderSource);
osg::ref_ptr<osg::Shader> fragmentShader = new osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource);
@ -385,19 +344,16 @@ void ConeWave::CreateRadarShader() {
program->addShader(vertexShader);
program->addShader(fragmentShader);
// 获取drawable的状态集并设置着色器程序
osg::StateSet* stateSet = coneDrawable_->getOrCreateStateSet();
stateSet->setAttributeAndModes(program, osg::StateAttribute::ON);
// 创建uniform变量
waveTimeUniform_ = new osg::Uniform("waveTime", 0.0f);
baseColorUniform_ = new osg::Uniform("baseColor", baseColor_); // 绿色雷达色调
baseColorUniform_ = new osg::Uniform("baseColor", baseColor_);
waveColorUniform_ = new osg::Uniform("waveColor", waveColor_);
levelHeightUniform_ = new osg::Uniform("height", height_ > 0 ? height_ : 100.0f); // 确保高度不为0
levelHeightUniform_ = new osg::Uniform("height", height_ > 0 ? height_ : 100.0f);
waveSpeedUniform_ = new osg::Uniform("waveSpeed", waveSpeed_ > 0 ? waveSpeed_ : 1.0f);
waveCountUniform_ = new osg::Uniform("waveCount", waveCount_ > 0 ? waveCount_ : 1);
// 创建透明度控制uniform变量
ringBrightAlphaUniform_ = new osg::Uniform("ringBrightAlpha", ringBrightAlpha_);
ringDarkAlphaUniform_ = new osg::Uniform("ringDarkAlpha", ringDarkAlpha_);

View File

@ -20,7 +20,6 @@ public:
void InitGeode();
void Destory();
// 雷达扫描波效果相关方法
void CreateRadarScanWave();
void CreateConeGeometry();
void CreateRadarShader();
@ -46,7 +45,6 @@ public:
return baseColor_;
}
// 透明度控制方法
void SetRingBrightAlpha(float alpha);
float GetRingBrightAlpha() const { return ringBrightAlpha_; }
@ -69,7 +67,6 @@ private:
float height_{ 6.0f };
float radius_{ 10.0f };
// 雷达扫描波效果相关成员变量
osg::ref_ptr<osg::Uniform> waveTimeUniform_;
osg::ref_ptr<osg::Uniform> waveRadiusUniform_;
osg::ref_ptr<osg::Uniform> waveSpeedUniform_;
@ -78,20 +75,18 @@ private:
osg::ref_ptr<osg::Uniform> waveColorUniform_;
osg::ref_ptr<osg::Uniform> levelHeightUniform_;
// 透明度控制uniform变量
osg::ref_ptr<osg::Uniform> ringBrightAlphaUniform_;
osg::ref_ptr<osg::Uniform> ringDarkAlphaUniform_;
osg::ref_ptr<osg::Uniform> coneAlphaUniform_;
float waveRadius_{ 100.0f }; // 扫描波最大半径
float waveSpeed_{ 20.0f }; // 扫描波速度
int waveCount_{ 30 }; // 同时存在的波纹数量
float waveRadius_{ 100.0f };
float waveSpeed_{ 20.0f };
int waveCount_{ 30 };
osg::Vec4 baseColor_{ 1.0f, 0.2f, 0.5f, 1.f };
osg::Vec4 waveColor_{ 0.0f, 0.5f, 1.0f, 0.8f }; // 扫描波颜色(蓝色)
double currentTime_{ 0.0 }; // 当前时间
osg::Vec4 waveColor_{ 0.0f, 0.5f, 1.0f, 0.8f };
double currentTime_{ 0.0 };
// 透明度值
float ringBrightAlpha_{ 0.8f }; // 亮环透明度
float ringDarkAlpha_{ 0.3f }; // 暗环透明度
float coneAlpha_{ 0.7f }; // 锥形透明度
float ringBrightAlpha_{ 0.8f };
float ringDarkAlpha_{ 0.3f };
float coneAlpha_{ 0.7f };
};

View File

@ -62,7 +62,6 @@ void ConeWaveComponent::Begin() {
void ConeWaveComponent::Update(double dt) {
UpdateEvent();
// 更新雷达扫描波效果
if (coneWave_.valid()) {
coneWave_->Render(dt);
}
@ -151,7 +150,6 @@ void ConeWaveComponent::UpdateEvent() {
coneWave_->setNodeMask(value == 0 ? 0x0 : 0xff);
}
// 雷达扫描波效果相关方法实现
void ConeWaveComponent::SetWaveRadius(float radius) {
if (coneWave_.valid()) {
coneWave_->SetWaveRadius(radius);