最新要闻
- 全球滚动:测排卵的最佳时间几点到几点_测排卵的最佳时间几点
- 国家市场监督管理总局:持续激发经营主体活力-环球观速讯
- 雷朋太阳镜官方旗舰店_雷朋 世界快播
- 今日热讯:努比亚首款AI裸眼3D平板!nubia Pad 3D开启预售:8+128GB卖10999元
- 面积稳、长势好新季花生产量乐观-世界快看
- 想念食品已回复审核问询函:“农业产业化国家重点龙头企业”,专注于挂面、面粉产品的研发、生产和销售
- 今头条!2023郑州高新区朗悦慧外国语中学需要摇号吗
- 当前时讯:一汽奔腾加速冲锋头部阵营
- 世界微速讯:英雄就在自己身边(纵横)
- 空心树桩成“景点” 各种野生动物纷纷来“打卡”
- 胡锡进宣布:正式进入中国股市!李大霄提建议_环球热点
- 环球热资讯!绿色之路圆桌丨食品行业怎样探寻双碳发展?
- 宝安头条|深圳轨道交通五期开工 完善宝安、前海片区地铁网络
- 又一里程碑!天津造空客A321neo首次交付欧洲
- 独立按键模组 魅族20 PANDAER抗菌手机壳图赏
- 西北首条!西安无人驾驶地铁正式开通:乘客可在车头车尾参观拍照
手机
天天最新:空蝉学园生活女警剧情怎么过
护航未成年人成长|市少先队校外禁毒宣传教育园地揭牌
- 天天最新:空蝉学园生活女警剧情怎么过
- 护航未成年人成长|市少先队校外禁毒宣传教育园地揭牌
- 27日唐山迁安部分普方坯资源涨50至3520含税出厂
- 广东省2023年普通高考志愿填报辅助系统来啦
- 焦点快看:5G手机渗透率已超50%
- 刘谦的白斩鸡怎么做?
家电
记录--Threejs-着色器实现一个水波纹
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
hree.js 是一个基于 WebGL 的 JavaScript 3D 库,用于创建和渲染 3D 图形场景。
一、 图像渲染过程
1、webGL
webGL:WebGL 是一种基于 JavaScript API 的图形库,它允许在浏览器中进行高性能的 3D 图形渲染。webGL的渲染依赖于底层GPU的渲染能力。通过获取元素获取WebGL的上下文,从而获得WebGL API和GPU。GPU图形处理器:处理图形计算的硬件。GPU运行着一个着色器小程序。包含两种类型的着色器程序,顶点着色器和片元着色器。
2、着色器
着色器:
(相关资料图)
3、坐标系
(1)模型空间:物体在其自身坐标系下的位置、大小、方向。(2)世界空间:所有模型都放置在同一坐标系下的空间。每个物体都有唯一的坐标系。如three.js的AxesHelper是基于世界空间创建的坐标系。(3)视图空间:相机所在的坐标系。简单来说就是以相机为原点,物体在相机眼中的位置。(4)投影空间:将3D图形投影到二维屏幕上的坐标系。将3D坐标转化为2D坐标。各个坐标系之间的转换:通过矩阵变换来完成。例如,将物体从模型空间转换到世界空间,可以使用模型变换矩阵将局部坐标转换为全局坐标。将物体从世界空间转换到视图空间,可以使用相机变换矩阵将全局坐标变换为相机坐标。最后,将视图空间中的坐标投影到屏幕上,可以使用投影变换矩阵将相机坐标变换为裁剪坐标。通过这些矩阵变换,可以将坐标从一个空间转换到另一个空间,从而实现3D图形的渲染和显示。
4、GPU渲染过程
(1)渲染管线:就是将3D坐标转化为屏幕像素(屏幕都是二维的,也就是二维坐标)的过程。分为以下几个阶段。应用阶段:由CPU控制,主要负责数据的准备和处理。CPU将数据发送的GPU,包括图形的顶点坐标、纹理坐标、颜色信息等 。几何阶段:运行在GPU中。将顶点坐标变换到屏幕空间中。光栅化阶段:阶段运行在GPU中。光栅化阶段主要将渲染图元转换为像素,并进行颜色插值、纹理采样等处理,最终输出渲染像素。
(2)GPU具体渲染过程。
齐次裁剪空间:简单来说就是相机视锥体的范围。如下图
二、着色器材质
three.js中有两个着色器材质ShaderMaterial
和原始着色器材质RawShaderMaterial
,它是用着色器语言GLSL编写的程序,可以让我们自定义物体的着色器程序,从而实现复杂的效果。 1、ShaderMaterial:材质接收两个着色器,顶点着色器和片元着色器。着色器代码需要我们自己编写,来实现复杂的效果。来看下如何使用。
用着色器材质实现下面这个效果:
搭建目录结构和基础看这里
1、首先搭建一个three.js场景
threejs_collision <script src="./main/index.js" type="module"></script>
*{ padding: 0; margin: 0;}body,html { background: green;}
import * as THREE from "three";import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";// 创建场景const scene = new THREE.Scene();// 创建相机const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000);// 设置相机位置camera.position.set(0, 0, 10);//将相机添加到scene.add(camera);//创建环境光,环境光会均匀的照亮场景中的所有物体。const light = new THREE.AmbientLight(0x404040);//将环境光添加到场景scene.add(light);// 创建平行光const directionalLight = new THREE.DirectionalLight();//设置光源位置directionalLight.position.set(0, 5, 0);//添加到场景scene.add(directionalLight);//设置光源投射阴影directionalLight.castShadow= true// 创建渲染器const renderer = new THREE.WebGLRenderer();// 设置渲染器尺寸renderer.setSize(window.innerWidth, window.innerHeight);//开启渲染器阴影计算renderer.shadowMap.enabled = true//将canvas添加到body中document.body.appendChild(renderer.domElement);// 轨道控制器const controls = new OrbitControls(camera, renderer.domElement);// 轨道控制器的阻尼感controls.enableDamping = true;//辅助坐标轴const axesHelp = new THREE.AxesHelper();scene.add(axesHelp);const clock = new THREE.Clock()//渲染函数function render() { //阻尼 controls.update() let time = clock.getDelta(); renderer.render(scene, camera); requestAnimationFrame(render);}// 初始化渲染函数render();// 监听浏览器窗口尺寸变化window.addEventListener("resize",() => { //重新设置相机宽高比 camera.aspect = window.innerWidth / window.innerHeight; //更新相机投影矩阵 camera.updateProjectionMatrix(); //重新设置渲染器尺寸 renderer.setSize(window.innerWidth,window.innerHeight); //设置设备像素比 renderer.setPixelRatio(window.devicePixelRatio)})
2、创建着色器材质
从上面动图可以看出,是一个平面贴了一张图,然后给这个平面加了wave的效果。所以,先创建一个平面。
const planeGeometry = new THREE.PlaneGeometry(1,1,64,64);引入贴图
const textureLoader = new THREE.TextureLoader();const texture = textureLoader.load( require("../asstes/img/texture/xx.jpeg"))
创建一个shader文件夹存放着色器代码,新建一个两个.glsl文件,来写顶点着色器和片元着色器代码。如下:
在js文件中引入这两个着色器:
import vertexShaderText from "../shader/basic/vertex.glsl"import fragmentShaderText from "../shader/basic/fragment.glsl"创建着色器材质
const material = new THREE.ShaderMaterial({ // 顶点着色器 vertexShader:vertexShaderText, // 片元着色器 fragmentShader:fragmentShaderText, // 设置两面可见,默认只能看见一面 side:THREE.DoubleSide,})
3、编写着色器代码
顶点着色器 使用的是着色器语言(GLSL),不会也没事,知道怎么接收参数,在哪写逻辑就够了。首先要有一个入口点,也就是下面的void main函数,对数据的处理就写在这里面。shader中有三种类型的变量: uniforms, attributes, 和 varyingsuniforms:从应用程序(CPU)传到着色器的变量(GPU),顶点着色器和片元着色器都能访问,比如我们可以在ShaderMaterial传递uniforms,在着色器程序中接收。用法:接收:uniform float uTime;
attributes:与每个顶点关联的变量。例如,顶点位置,法线和顶点颜色都是存储在attributes中的数据。attributes只可以在顶点着色器中访问。用法:attribute vec3 position
。Varyings:在顶点着色器和片元着色器中传递数据。可以将顶点着色器处理过的数据通过varyings传给片元着色器。用法:varying vec2 vUv
;
// 高精度浮点数precision highp float;void main(){ // vec4 四维向量 vec4 modelPosition = modelMatrix * vec4(position, 1.0); // projectionMatrix 投影矩阵;viewMatrix 视图矩阵;modelMatrix 模型矩阵;跟上面提到的坐标系对应。这些都是内置的uniform,使用ShaderMaterial会自动到GLSL shader代码中。使用RawShaderMaterial不会自动添加,需要手动接收。 //gl_Position是一个内置变量,它表示经过投影、视图和模型变换后的顶点位置。 gl_Position = projectionMatrix * viewMatrix * modelPosition;}片元着色器:
// 中等精度浮点数precision mediump float;void main(){ // gl_FragColor内置对象,片元的颜色值 vec4是个思维变量这里代表了红色分量、绿色分量、蓝色分量和透明度分量。 gl_FragColor = vec4(1.0,1.0,0.0,1.0); }
效果:注意这个平面的颜色是片元着色器里gl_FragColor对象决定的,现在是写死的(当然也可以写活)。
接下来给这个平面添加wave的效果:这个平面在X、y轴,通过改变Z轴的坐标来使平面有上下波动的效果,这个波动的效果像不像正弦余弦曲线,可以通过sin,cos实现这个效果。可以通过Uniforms变量将数据传给顶点着色器和片元着色器。
const clock = new THREE.Clock()//渲染函数function render() { let time = clock.getElapsedTime() material.uniforms.uTime.value = time;}const material = new THREE.ShaderMaterial({ uniforms:{ uTime:{ value:0 }, // 贴图 uTexture:{ value: texture } }})顶点着色器程序:
precision mediump float;uniform float uTime;//varying:从顶点着色器传递到片元着色器的变量。 将uv传递到片元着色器。uv是二维坐标,是物体顶点在纹理上的映射位置(相当于将一个3维物体展开后的对应的二维位置)。传递给片元着色器可以读取该坐标处的颜色,赋值给gl_FragColor,实现贴图效果。varying vec2 vUv;void main(){ vUv = uv; vec4 modelPosition = modelMatrix * vec4(position, 1.0); modelPosition.z = sin((modelPosition.x + uTime) * 10.0) * 0.05; modelPosition.z += sin((modelPosition.y + uTime) * 10.0) * 0.05; gl_Position = projectionMatrix * viewMatrix * modelPosition;}片元着色器程序:
precision mediump float;// sampler2D类型的纹理变量uniform sampler2D uTexture;// 接收顶点着色器传来的uvvarying vec2 vUv;void main(){ // texture2D是用于读取纹理颜色值的函数 vec4 textureColor = texture2D(uTexture,vUv); gl_FragColor = textureColor; }
这样就是实现了以上效果。
如果是RawShaderMaterial材质,内置的uniform需要手动去接收,以上代码改成:顶点着色器程序:
precision mediump float;// 定义顶点attribute vec3 position;//定义位置参数attribute vec2 uv;// 传入投影矩阵uniform mat4 projectionMatrix;// 传入视图矩阵uniform mat4 viewMatrix;// 传入模型矩阵uniform mat4 modelMatrix;//接收着色器材质传递的时间参数uniform float uTime;// uv传递到片元着色器 varying是从顶点着色器传递到片元着色器的变量varying vec2 vUv;void main(){ vUv = uv; vec4 modelPosition = modelMatrix * vec4(position,1.0); modelPosition.z = sin((modelPosition.x + uTime) * 10.0) * 0.05; modelPosition.z += sin((modelPosition.y + uTime) * 10.0) * 0.05; gl_Position = projectionMatrix * viewMatrix * modelPosition;}
三、着色器实现一个水波纹
水波纹相对于上面旗帜飘动的效果,多了些随机性。如水波的高度是变化的,波浪的起伏是随机的,高处和低处的颜色不一样,水波波动的大小、频率等。这里用到了一些随机函数。将这些随机性添加给波浪的高度来达到更真实的效果。下面定义了很多参数,这些参数可以自己去调节看看它们是什么作用。
const material = new THREE.ShaderMaterial({ vertexShader:vertexShaderText, fragmentShader:fragmentShaderText, side:THREE.DoubleSide, uniforms:{ uTime:{ value:0 }, uWaresFrequency:{ value:params.uWaresFrequency }, uScale:{ value:params.uScale }, uNoiseFrequency:{ value:params.uNoiseFrequency }, uNoiseScale:{ value: params.uNoiseScale }, uXzScale:{ value: params.uXzScale }, uLowColor:{ value:new THREE.Color(params.uLowColor) }, uHighColor: { value:new THREE.Color(params.uHighColor) }, uOpacity:{ value:params.uOpacity } }, transparent: true})const plane = new THREE.Mesh(planeGeometry,material)plane.rotation.x = -Math.PI / 2scene.add(plane)// 将这些uniforms变量添加到gui在,方便看效果,找到最合适的值。gui.add(params,"uWaresFrequency").min(1).max(50).step(0.1).onChange(val => { material.uniforms.uWaresFrequency.value = val;});gui.add(params,"uScale").min(0).max(0.2).step(0.01).onChange(val => { material.uniforms.uScale.value = val;});gui.add(params,"uNoiseFrequency").min(0).max(100).step(0.1).onChange(val => { material.uniforms.uNoiseFrequency.value = val;});gui.add(params,"uNoiseScale").min(0).max(5).step(0.01).onChange(val => { material.uniforms.uNoiseScale.value = val;});gui.add(params,"uXzScale").min(1).max(5).step(0.01).onChange(val => { material.uniforms.uXzScale.value = val;});gui.addColor(params,"uLowColor").onFinishChange(val => { material.uniforms.uLowColor.value = new THREE.Color(val)})gui.addColor(params,"uHighColor").onFinishChange(val => { material.uniforms.uHighColor.value = new THREE.Color(val)})gui.add(params,"uOpacity").min(0).max(1).onChange(val => { material.uniforms.uOpacity.value = val;})顶点着色器程序:里面的函数都是从这本书里抄的
uniform float uTime;uniform float uWaresFrequency;uniform float uScale;uniform float uNoiseFrequency;uniform float uNoiseScale;uniform float uXzScale;varying float vElevation;float random (vec2 st) { return fract(sin(dot(st.xy,vec2(12.9898,78.233)))*43758.5453123);}// 旋转函数vec2 rotate(vec2 uv, float rotation, vec2 mid){ return vec2( cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x, cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y );}// 2d噪声函数 float noise (in vec2 st) { vec2 i = floor(st); vec2 f = fract(st); float a = random(i); float b = random(i + vec2(1.0, 0.0)); float c = random(i + vec2(0.0, 1.0)); float d = random(i + vec2(1.0, 1.0)); vec2 u = f*f*(3.0-2.0*f); return mix(a, b, u.x) + (c - a)* u.y * (1.0 - u.x) + (d - b) * u.x * u.y;}// 随机函数vec4 permute(vec4 x){ return mod(((x*34.0)+1.0)*x, 289.0);}vec2 fade(vec2 t){ return t*t*t*(t*(t*6.0-15.0)+10.0);}float cnoise(vec2 P){ vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0); vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0); Pi = mod(Pi, 289.0); // To avoid truncation effects in permutation vec4 ix = Pi.xzxz; vec4 iy = Pi.yyww; vec4 fx = Pf.xzxz; vec4 fy = Pf.yyww; vec4 i = permute(permute(ix) + iy); vec4 gx = 2.0 * fract(i * 0.0243902439) - 1.0; // 1/41 = 0.024... vec4 gy = abs(gx) - 0.5; vec4 tx = floor(gx + 0.5); gx = gx - tx; vec2 g00 = vec2(gx.x,gy.x); vec2 g10 = vec2(gx.y,gy.y); vec2 g01 = vec2(gx.z,gy.z); vec2 g11 = vec2(gx.w,gy.w); vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)); g00 *= norm.x; g01 *= norm.y; g10 *= norm.z; g11 *= norm.w; float n00 = dot(g00, vec2(fx.x, fy.x)); float n10 = dot(g10, vec2(fx.y, fy.y)); float n01 = dot(g01, vec2(fx.z, fy.z)); float n11 = dot(g11, vec2(fx.w, fy.w)); vec2 fade_xy = fade(Pf.xy); vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x); float n_xy = mix(n_x.x, n_x.y, fade_xy.y); return 2.3 * n_xy;}void main() { vec4 modelPosition = modelMatrix * vec4(position,1.0); // 波浪高度 float elevation = sin(modelPosition.x * uWaresFrequency) * sin(modelPosition.z * uWaresFrequency * uXzScale); elevation += cnoise(vec2(modelPosition.xz*uNoiseFrequency+uTime)) *uNoiseScale; elevation *= uScale; // 传到片元着色器 vElevation = elevation; modelPosition.y += elevation; gl_Position = projectionMatrix * viewMatrix * modelPosition;}片元着色器程序:
varying float vElevation;uniform vec3 uLowColor;uniform vec3 uHighColor;uniform float uOpacity;void main(){ float a = (vElevation + 1.0) / 2.0; // 混合颜色 vec3 color = mix(uLowColor,uHighColor,a); gl_FragColor = vec4(color,uOpacity);}最终效果(效果可以调节参数,调到自己满意的效果):
本文转载于:
https://juejin.cn/post/7248982532728864825
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
记录--Threejs-着色器实现一个水波纹
胡锡进回应网传“胡锡进商业版图”:有人无聊至极、心术不正|天天时快讯
雪糕之后,年轻人又被共享单车背刺
韩国友珍答:面部拉皮提升好看吗?
十一去哪儿玩?(10 1去哪玩)
天天最新:空蝉学园生活女警剧情怎么过
全球热点!“沉浸式”体验!外国友人“感知岱岳·品味黑桃”
每日快播:保利置业退出投资惠州胜龙房地产 投资数额8000万人民币
南方上海金ETF发起联接基金(A类:018391;C类:018392)即将发售,跟踪黄金资产价格变化
每日速看!win11动态壁纸设置教程
普通高中国家助学金申请书范文1500_普通高中国家助学金申请书范文 前沿资讯
全球滚动:测排卵的最佳时间几点到几点_测排卵的最佳时间几点
索尼互娱总裁表示《使命召唤》系列仍登陆PlayStation平台
杜特尔特发出战争警告:在菲美军基地,将让菲成为中美冲突炮灰
天天快消息!黄山屯溪区:智慧闯关 争做最亮之星
长三角铁路发送旅客超900万人次-视讯
产品经理进阶:小 IPD 开发流程 焦点精选
黄金和硬金哪个更值钱_全球快看点
快资讯:5g黄金是什么金
《死亡空间重制版》通关流程要点 全章节怎么通关?|当前热闻
惠特摩尔:我要练中距离 阿门-汤普森:我要全方位提升投篮
多只成分股涨幅超5% 这一板块狂飙! 世界要闻
中国援埃及二号卫星项目初样星交付 全球快报
谭雅玲:市场机制与结构组合恰到好处促进加息
聚焦:潜逃6年, 女毒贩在国际禁毒日前落网
招行员工,在拼多多完成业绩
焦点快报!债券注册制改革全面落地 制度凸显五大特点
环球百事通!诺和诺德:口服版司美格鲁肽可助肥胖者减重15%
“复旦毕业生用泳装照求职”引热议,校方辟谣!律师称可报警
2023年北京房山金林嘉苑共有产权住房资格审核及结果查询
世界聚焦:华荣股份(603855.SH)董事李江与李妙华拟合计减持不超2.45%股份
全球视点!2000余件精品亮相 “非”一般的甘肃你爱了吗
创维数字(000810.SZ):智能机顶盒、智能网关业务今年在国内外运营商市场的中标及份额是已显著得提升
卖楼抵债!知名巨头关闭所有门店,网友唏嘘-当前视点
她将“不可能”变成“可能” 环球百事通
多巴胺穿搭走红,有演员“拍同款”?律师提醒……
环球动态:台州开车1.5小时,浙江的童话王国,美得令人惊叹,景色不输意大利
江苏1-5月固定资产投资同比增长5.2% 居民消费价格同比上涨1.1%
公司成立新的公司原来公司合同能否还有效
招行员工,在拼多多完成业绩|世界速读
今日热门!青春梦想与时代脉搏同频共振
护航未成年人成长|市少先队校外禁毒宣传教育园地揭牌
传火侠的次元之旅_传火 全球报道
吴组词1000个(吴组词)
怎么唱好歌气息训练视频教程(怎么唱好歌)
u盘快速重启-(怎么重启u盘) 天天热消息
6月27日生意社DMF基准价为4725.00元/吨_全球今日讯
轻工行业2023年中期策略报告:成本下行助力盈利修复 关注下游需求回暖节奏-天天热资讯
前沿资讯!咒术回战227话预览图 五条悟与宿傩一进一退的巅峰最强对决
摩托罗拉 X30 开始推送基于安卓 13 的 moto MYUI 大版本升级
大晟文化06月26日涨停分析|全球观速讯
中国海军舰艇大全2019号_中国海军舰艇大全2019 今日最新
海南儋州:特色农业“接二连三”融合发展助推乡村振兴
全球快资讯:洛克王国宠物碎片怎么得2022 洛克王国宠物碎片怎么得
徐汇这家商场给你免费搭积木,还能享受便民服务
Dicky TWISTER翻译_dicky-天天观天下
硬核科技论 | 保时捷918继任者纯电化!全新Mission X这些技术值得了解
环球最新:基于EMP2 V3平台/采用全新设计 全新DS 4将于7月13日正式上市
预售价22.5万元 小鹏G6将于6月29日晚正式上市
手机字体怎么恢复成原来的样子_手机字体 环球头条
智能印章是什么意思_智能印章是什么相关介绍简介 当前速读
王卡宽带和普通宽带_什么是王卡宽带相关介绍简介-全球即时
河北隆化:“共享农场”绘就乡村振兴新画卷
预计7月1日起 复兴号将在青藏铁路正式投用_当前观察
全球观察:两市融资余额减少18.33亿元
国家市场监督管理总局:持续激发经营主体活力-环球观速讯
中国女篮在亚洲杯的第二个对手新西兰女篮 有个行走的两双王 焦点快报
“边炒股边学习,力争少交学费”!著名媒体人胡锡进:已开一个股票账户 正式进入中国股市
有的时候_对于有的时候简单介绍
环球微速讯:【新华财经调查】全面覆盖三农普惠制造业 金融支持实体经济构建立体图景
中金公司:成本下行、供需改善推动光伏玻璃盈利修复
看点:羽毛球技术图解_关于羽毛球技术图解介绍
书山有路勤为径学海无涯苦作舟是谁写的_书山有路勤为径学海无涯苦作舟作者是谁
雷朋太阳镜官方旗舰店_雷朋 世界快播
再降40元!魔声人体工学耳机低至399元 世界播报
全球视讯!僚机是什么意思(僚机是什么意思网络用语)
【环球快播报】昌乐县检验检测中心志愿服务队(关于昌乐县检验检测中心志愿服务队的简介)
环球观热点:重庆力争到2025年森林覆盖率稳定在55%以上
曾扩情(关于曾扩情介绍)_世界播资讯
山东有哪些大学是二本大学(山东有哪些大学是二本)
今日热讯:努比亚首款AI裸眼3D平板!nubia Pad 3D开启预售:8+128GB卖10999元
面积稳、长势好新季花生产量乐观-世界快看
想念食品已回复审核问询函:“农业产业化国家重点龙头企业”,专注于挂面、面粉产品的研发、生产和销售
上海多项医保惠民政策2023年7月1日起实施
世界今热点:辉煌不再,港股IPO上半年跌出全球前三
遵义市公安局走访慰问离退休干部
只签了三方协议毁约多少钱|世界最资讯
智通全球财经日志|6月27日-当前热闻
焦点简讯:近期天象 | 事件频出、意外爆发,这颗天王星却给了我们觉醒的力量(附建议)
今日热搜:国家级经开区集聚外资企业超3万家
苹果iPhone 15 Pro Max手机保护壳曝光 静音键首次被取代
味知香: 我们会将您的建议转达至公司管理层,并针对合理性建议不断改进完善-要闻速递
6月26日北向资金最新动向(附十大成交股)
《南洋女儿情》南兰结局是什么 南兰最后结局死了吗
康抗生物完成超1亿元Pre-A轮融资,为复宏汉霖姜伟东的二次创业-环球通讯
27日唐山迁安部分普方坯资源涨50至3520含税出厂
世界滚动:唐三喜欢小舞吗?谁又知道值得二字的重量
“抠门儿”工长 每日速递
中考成绩预计下月中旬发布 志愿填报时间尚不确定 热点评
今头条!2023郑州高新区朗悦慧外国语中学需要摇号吗