You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLSL顶点着色器使用cos与time变量实现模型缩放动画问题

OpenGL顶点着色器实现模型周期性缩放动画失效修复

问题背景

需要使用time时间变量搭配cos()函数实现兔子模型的周期性放大缩小动画,目前time变量已成功传入顶点着色器,但套用网络找到的公式始终无法实现预期效果。

说明:英语非提问者母语
兔子模型参考


现有问题代码

C++端animate传参实现

void MaterialTP2::animate(Node* o, const float elapsedTime) {
    Camera * test = Scene::getInstance()->camera(); 
    glProgramUniformMatrix4fv(m_ProgramPipeline->getId(), l_View, 1, GL_FALSE, glm::value_ptr(test->getViewMatrix()));
    glProgramUniformMatrix4fv(m_ProgramPipeline->getId(), l_Model, 1, GL_FALSE, glm::value_ptr(o->frame()->getModelMatrix()));
    glProgramUniformMatrix4fv(m_ProgramPipeline->getId(), l_Proj, 1, GL_FALSE, glm::value_ptr(test->getProjectionMatrix()));
    glProgramUniform1f(m_ProgramPipeline->getId(), glGetUniformLocation(vp->getId(), "time"), elapsedTime);
}

顶点着色器代码

#version 460

#define PI 3.1415926538
uniform mat4 Model;
uniform mat4 View;
uniform mat4 Proj;
uniform float time;

out gl_PerVertex {
    vec4 gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
};

layout (location = 0) in vec3 Position;
layout(location = 2) in vec3 normal;
varying vec3 out_color;

void main()
{
    float scaleFactor = 0.2 * cos((2 * PI) / time * 100 );
    gl_Position = Proj * View * Model  * vec4(Position  ,1.0) ;
    out_color = 0.5 * normal  + vec3(0.5, 0.5, 0.5);
} 

错误点排查

  • 核心逻辑遗漏:计算出的scaleFactor缩放因子完全没有参与顶点位置计算,顶点坐标直接传入MVP矩阵转换,自然不会有任何缩放效果。
  • 周期公式错误:cos()内的周期计算逻辑写反,(2 * PI) / time * 100在time趋近于0时数值会趋于无穷大,完全不符合周期性动画的计算逻辑,正确的周期参数格式应为2*PI*动画频率*time。
  • 缩放取值范围错误:计算出的scaleFactor取值范围为[-0.2, 0.2],既没有以1为基础缩放基准,还会出现负缩放导致模型翻面、尺寸过小的问题。

修正后代码

直接替换顶点着色器的main函数逻辑即可:

void main()
{
    // 动画参数:0.5为频率(即每2秒完成一次缩放循环),0.2为缩放浮动幅度
    float scaleFactor = 1.0 + 0.2 * cos(2 * PI * 0.5 * time);
    // 对顶点位置执行缩放后再做MVP矩阵变换
    vec3 scaledPosition = Position * scaleFactor;
    gl_Position = Proj * View * Model * vec4(scaledPosition, 1.0);
    out_color = 0.5 * normal + vec3(0.5, 0.5, 0.5);
}

参数调整说明

  • 调整动画速度:修改2 * PI * 0.5 * time中的0.5数值即可,数值越大动画循环速度越快,例如改为1则每1秒完成一次缩放循环。
  • 调整缩放幅度:修改公式中的0.2系数即可,数值越大模型缩放的尺寸变化越明显。
  • 调整缩放中心:当前写法以模型局部坐标原点为缩放中心,如果需要以自定义点为中心缩放,先将顶点坐标减去中心点坐标,完成缩放后再加回中心点坐标即可。

内容的提问来源于stack exchange,提问作者Clement Brct

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:45:32