three.js官方案例webgpu_reflection.html学习记录

目录

​1 判断浏览器是否支持

2 THREE.DirectionalLight

2.1DirectionalLightShadow

3 Texture

3.1 .wrapS

3.2 .wrapT

3.3  .colorSpace

4 创建地面

5 WebGPURenderer

6 OrbitControls 控制器

7 屏幕后处理


	import * as THREE from 'three';import { MeshPhongNodeMaterial, color, pass, reflector, normalWorld, texture, uv, viewportTopLeft } from 'three/nodes';//引入一些类import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';//引入加载器import WebGPU from 'three/addons/capabilities/WebGPU.js';//引入WebGPUimport WebGL from 'three/addons/capabilities/WebGL.js';//引入WebGLimport WebGPURenderer from 'three/addons/renderers/webgpu/WebGPURenderer.js';//WebGPU渲染import PostProcessing from 'three/addons/renderers/common/PostProcessing.js';//后处理import { OrbitControls } from 'three/addons/controls/OrbitControls.js';//控制器import Stats from 'three/addons/libs/stats.module.js';//性能检测let camera, scene, renderer;//相机 场景 渲染器let model, mixer, clock;//模型 动画混合器  时钟let postProcessing;//后期处理let controls;//控制器let stats;//性能检测

1 判断浏览器是否支持

if ( WebGPU.isAvailable() === false && WebGL.isWebGL2Available() === false ) {document.body.appendChild( WebGPU.getErrorMessage() );throw new Error( 'No WebGPU or WebGL2 support' );//不支持}

2 THREE.DirectionalLight

.shadow : DirectionalLightShadow

DirectionalLightShadow 对象,用于计算该平行光产生的阴影。

2.1DirectionalLightShadow

        这是用于在DirectionalLights内部计算阴影
与其他阴影类不同,它是使用OrthographicCamera来计算阴影,而不是PerspectiveCamera。这是因为来自DirectionalLight的光线是平行的。

 //模拟太阳const sunLight = new THREE.DirectionalLight( 0xFFE499, 5 );//.castShadow : Boolean  此属性设置为 true 灯光将投射阴影。注意:这样做的代价比较高,需要通过调整让阴影看起来正确。 查看 DirectionalLightShadow 了解详细信息。 默认值为 false。sunLight.castShadow = true;//.shadow DirectionalLightShadow 对象,用于计算该平行光产生的阴影//.camera : Camera  在光的世界里。这用于生成场景的深度图;从光的角度来看,其他物体背后的物体将处于阴影中sunLight.shadow.camera.near = .1;//摄像机视锥体近端面sunLight.shadow.camera.far = 5;//摄像机视锥体远端面sunLight.shadow.camera.right = 2;sunLight.shadow.camera.left = - 2;//摄像机视锥体左侧面sunLight.shadow.camera.top = 2;//摄像机视锥体上侧面sunLight.shadow.camera.bottom = - 2;// .mapSize : Vector2 一个Vector2定义阴影贴图的宽度和高度。
//较高的值会以计算时间为代价提供更好的阴影质量。值必须是2的幂,直到给定设备的WebGLRenderer.capabilities.maxTextureSize, 虽然宽度和高度不必相同(例如,(512,1024)有效)。 默认值为(512,512)。sunLight.shadow.mapSize.width = 2048;sunLight.shadow.mapSize.height = 2048;//.bias : Float
//阴影贴图偏差,在确定曲面是否在阴影中时,从标准化深度添加或减去多少。
//默认值为0.此处非常小的调整(大约0.0001)可能有助于减少阴影中的伪影sunLight.shadow.bias = - 0.001;//.position : Vector3   假如这个值设置为 Object3D.DEFAULT_UP (0, 1, 0),光线将会从上往下照射sunLight.position.set( .5, 3, .5 );

半球光(HemisphereLight)

光源直接放置于场景之上,光照颜色从天空光线颜色渐变到地面光线颜色。半球光不能投射阴影。

3 Texture

包裹模式

THREE.RepeatWrapping THREE.ClampToEdgeWrapping THREE.MirroredRepeatWrapping

这些常量定义了纹理贴图的 wrapS 和 wrapT 属性,定义了水平和垂直方向上纹理的包裹方式。

使用RepeatWrapping,纹理将简单地重复到无穷大。 With RepeatWrapping the texture will simply repeat to infinity.

ClampToEdgeWrapping是默认值,纹理中的最后一个像素将延伸到网格的边缘。

使用MirroredRepeatWrapping, 纹理将重复到无穷大,在每次重复时将进行镜像。

.colorSpace

默认值为THREE.NoColorSpace。 请参阅texture constants来了解其他格式的详细信息

3.1 .wrapS

        这个值定义了纹理贴图在水平方向上将如何包裹,在UV映射中对应于U。

默认值是THREE.ClampToEdgeWrapping,即纹理边缘将被推到外部边缘的纹素。 其它的两个选项分别是THREE.RepeatWrapping和THREE.MirroredRepeatWrapping。 请参阅texture constants来了解详细信息。

3.2 .wrapT

        这个值定义了纹理贴图在垂直方向上将如何包裹,在UV映射中对应于V。

可以使用与 .wrapS : number相同的选项。

请注意:纹理中图像的平铺,仅有当图像大小(以像素为单位)为2的幂(2、4、8、16、32、64、128、256、512、1024、2048、……)时才起作用。 宽度、高度无需相等,但每个维度的长度必须都是2的幂。 这是WebGL中的限制,不是由three.js所限制的。

使用RepeatWrapping,纹理将简单地重复到无穷大  使用MirroredRepeatWrapping, 纹理将重复到无穷大,在每次重复时

3.3  .colorSpace

 色彩空间

THREE.NoColorSpace = "" THREE.SRGBColorSpace = "srgb" THREE.LinearSRGBColorSpace = "srgb-linear"

      用于定义纹理的色彩空间(以及渲染器的输出色彩空间)。
如果在材质已使用纹理后更改了颜色空间类型, 您需要将 Material.needsUpdate 设置为使材料重新编译。true

	const textureLoader = new THREE.TextureLoader();//图片下载const floorColor = textureLoader.load( '../three.js-r163/examples/textures/floors/FloorsCheckerboard_S_Diffuse.jpg' );//地面//这个值定义了纹理贴图在水平方向上将如何包裹,在UV映射中对应于U。
//默认值是THREE.ClampToEdgeWrapping,即纹理边缘将被推到外部边缘的纹素。 其它的两个选项分别是THREE.RepeatWrapping和THREE.MirroredRepeatWrapping。 请参阅texture constants来了解详细信息。floorColor.wrapS = THREE.RepeatWrapping;//这个值定义了纹理贴图在垂直方向上将如何包裹,在UV映射中对应于V。
//可以使用与 .wrapS : number相同的选项。
//请注意:纹理中图像的平铺,仅有当图像大小(以像素为单位)为2的幂(2、4、8、16、32、64、128、256、512、1024、2048、……)时才起作用。 宽度、高度无需相等,但每个维度的长度必须都是2的幂。 这是WebGL中的限制,不是由three.js所限制的。floorColor.wrapT = THREE.RepeatWrapping;//使用RepeatWrapping,纹理将简单地重复到无穷大  使用MirroredRepeatWrapping, 纹理将重复到无穷大,在每次重复时将进行镜像//色彩空间//默认值为THREE.NoColorSpace。 请参阅texture constants来了解其他格式的详细信息floorColor.colorSpace = THREE.SRGBColorSpace;

4 创建地面

这部分没看太懂,后面再补充吧,先就这么跟着用吧。

MeshPhongNodeMaterial

uv

   texture

TextureNode.js

5 WebGPURenderer

antialias - 是否执行抗锯齿。默认为false

.setAnimationLoop ( callback : Function ) : undefined

callback — 每个可用帧都会调用的函数。 如果传入‘null’,所有正在进行的动画都会停止。

可用来代替requestAnimationFrame的内置函数. 对于WebXR项目,必须使用此函数。

renderer = new WebGPURenderer( { antialias: true } );renderer.setPixelRatio( window.devicePixelRatio );//setPixelRatio 设置设备像素比。通常用于避免HiDPI设备上绘图模糊//setSize 将输出canvas的大小调整为(width, height)并考虑设备像素比,且将视口从(0, 0)开始调整到适合大小 将updateStyle设置为false以阻止对canvas的样式做任何改变。renderer.setSize( window.innerWidth, window.innerHeight );renderer.setAnimationLoop( animate );document.body.appendChild( renderer.domElement );

6 OrbitControls 控制器

  //控制器controls = new OrbitControls( camera, renderer.domElement );controls.minDistance = 1;//你能够将相机向内移动多少controls.maxDistance = 10;//你能够将相机向外移动多少controls.maxPolarAngle = Math.PI / 2;//你能够垂直旋转的角度的下限,范围是0到Math.PI,其默认值为0controls.autoRotate = true;//将其设为true,以自动围绕目标旋转。请注意,如果它被启用,你必须在你的动画循环里调用.update()controls.autoRotateSpeed = 1;//当.autoRotate为true时,围绕目标旋转的速度将有多快,默认值为2.0,相当于在60fps时每旋转一周需要30秒controls.target.set( 0, .5, 0 );//控制器的焦点,.object的轨道围绕它运行。 它可以在任何时候被手动更新,以更改控制器的焦点controls.update();//更新控制器。必须在摄像机的变换发生任何手动改变后调用

7 屏幕后处理

这部分没看太懂,后面再补充吧,先就这么跟着用吧。

后处理的脚本注掉,整个屏幕变黑。

	// post-processing 屏幕后处理const scenePass = pass( scene, camera );const scenePassColor = scenePass.getTextureNode();//颜色const scenePassDepth = scenePass.getDepthNode().remapClamp( .3, .5 ); //深度const scenePassColorBlurred = scenePassColor.gaussianBlur();scenePassColorBlurred.directionNode = scenePassDepth;const vignet = viewportTopLeft.distance( .5 ).mul( 1.35 ).clamp().oneMinus();postProcessing = new PostProcessing( renderer );//后处理postProcessing.outputNode = scenePassColorBlurred.mul( vignet );

7 全部脚本

<!DOCTYPE html>
<html lang="en"><head><title>three.js webgpu - reflection</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><link type="text/css" rel="stylesheet" href="../three.js-r163/examples/main.css"></head><body><div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgpu - reflection</div><script type="importmap">{"imports": {"three": "../three.js-r163/build/three.module.js","three/addons/": "../three.js-r163/examples/jsm/","three/nodes": "../three.js-r163/examples/jsm/nodes/Nodes.js"}}</script><script type="module">import * as THREE from 'three';import { MeshPhongNodeMaterial, color, pass, reflector, normalWorld, texture, uv, viewportTopLeft } from 'three/nodes';//引入一些类import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';//引入加载器import WebGPU from 'three/addons/capabilities/WebGPU.js';//引入WebGPUimport WebGL from 'three/addons/capabilities/WebGL.js';//引入WebGLimport WebGPURenderer from 'three/addons/renderers/webgpu/WebGPURenderer.js';//WebGPU渲染import PostProcessing from 'three/addons/renderers/common/PostProcessing.js';//后处理import { OrbitControls } from 'three/addons/controls/OrbitControls.js';//控制器import Stats from 'three/addons/libs/stats.module.js';//性能检测let camera, scene, renderer;//相机 场景 渲染器let model, mixer, clock;//模型 动画混合器  时钟let postProcessing;//后期处理let controls;//控制器let stats;//性能检测init();function init() {if ( WebGPU.isAvailable() === false && WebGL.isWebGL2Available() === false ) {document.body.appendChild( WebGPU.getErrorMessage() );throw new Error( 'No WebGPU or WebGL2 support' );//不支持}//创建相机camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.25, 30 );camera.position.set( 2, 2.5, 3 );//场景scene = new THREE.Scene();scene.fog = new THREE.Fog( 0x0487e2, 7, 25 );//雾scene.backgroundNode = normalWorld.y.mix( color( 0x0487e2 ), color( 0x0066ff ) );camera.lookAt( 0, 1, 0 );//模拟太阳const sunLight = new THREE.DirectionalLight( 0xFFE499, 5 );//.castShadow : Boolean  此属性设置为 true 灯光将投射阴影。注意:这样做的代价比较高,需要通过调整让阴影看起来正确。 查看 DirectionalLightShadow 了解详细信息。 默认值为 false。sunLight.castShadow = true;//.shadow DirectionalLightShadow 对象,用于计算该平行光产生的阴影//.camera : Camera  在光的世界里。这用于生成场景的深度图;从光的角度来看,其他物体背后的物体将处于阴影中sunLight.shadow.camera.near = .1;//摄像机视锥体近端面sunLight.shadow.camera.far = 5;//摄像机视锥体远端面sunLight.shadow.camera.right = 2;sunLight.shadow.camera.left = - 2;//摄像机视锥体左侧面sunLight.shadow.camera.top = 2;//摄像机视锥体上侧面sunLight.shadow.camera.bottom = - 2;// .mapSize : Vector2 一个Vector2定义阴影贴图的宽度和高度。
//较高的值会以计算时间为代价提供更好的阴影质量。值必须是2的幂,直到给定设备的WebGLRenderer.capabilities.maxTextureSize, 虽然宽度和高度不必相同(例如,(512,1024)有效)。 默认值为(512,512)。sunLight.shadow.mapSize.width = 2048;sunLight.shadow.mapSize.height = 2048;//.bias : Float
//阴影贴图偏差,在确定曲面是否在阴影中时,从标准化深度添加或减去多少。
//默认值为0.此处非常小的调整(大约0.0001)可能有助于减少阴影中的伪影sunLight.shadow.bias = - 0.001;//.position : Vector3   假如这个值设置为 Object3D.DEFAULT_UP (0, 1, 0),光线将会从上往下照射sunLight.position.set( .5, 3, .5 );//半球光const waterAmbientLight = new THREE.HemisphereLight( 0x333366, 0x74ccf4, 5 );const skyAmbientLight = new THREE.HemisphereLight( 0x74ccf4, 0, 1 );scene.add( sunLight );scene.add( skyAmbientLight );scene.add( waterAmbientLight );clock = new THREE.Clock();//// animated modelconst loader = new GLTFLoader();loader.load( '../three.js-r163/examples/models/gltf/Michelle.glb', function ( gltf ) {model = gltf.scene;model.children[ 0 ].children[ 0 ].castShadow = true;//mixer = new THREE.AnimationMixer( model );//动画混合器console.log(gltf.animations);const action = mixer.clipAction( gltf.animations[ 0 ] );action.play();scene.add( model );} );// texturesconst textureLoader = new THREE.TextureLoader();//图片下载const floorColor = textureLoader.load( '../three.js-r163/examples/textures/floors/FloorsCheckerboard_S_Diffuse.jpg' );//地面//这个值定义了纹理贴图在水平方向上将如何包裹,在UV映射中对应于U。
//默认值是THREE.ClampToEdgeWrapping,即纹理边缘将被推到外部边缘的纹素。 其它的两个选项分别是THREE.RepeatWrapping和THREE.MirroredRepeatWrapping。 请参阅texture constants来了解详细信息。floorColor.wrapS = THREE.RepeatWrapping;//这个值定义了纹理贴图在垂直方向上将如何包裹,在UV映射中对应于V。
//可以使用与 .wrapS : number相同的选项。
//请注意:纹理中图像的平铺,仅有当图像大小(以像素为单位)为2的幂(2、4、8、16、32、64、128、256、512、1024、2048、……)时才起作用。 宽度、高度无需相等,但每个维度的长度必须都是2的幂。 这是WebGL中的限制,不是由three.js所限制的。floorColor.wrapT = THREE.RepeatWrapping;//使用RepeatWrapping,纹理将简单地重复到无穷大  使用MirroredRepeatWrapping, 纹理将重复到无穷大,在每次重复时将进行镜像//色彩空间//默认值为THREE.NoColorSpace。 请参阅texture constants来了解其他格式的详细信息floorColor.colorSpace = THREE.SRGBColorSpace;const floorNormal = textureLoader.load( '../three.js-r163/examples/textures/floors/FloorsCheckerboard_S_Normal.jpg' );floorNormal.wrapS = THREE.RepeatWrapping;floorNormal.wrapT = THREE.RepeatWrapping;// floorconsole.log(uv());//UVNodeconst floorUV = uv().mul( 15 );console.log(floorUV);//OperatorNodeconst floorNormalOffset = texture( floorNormal, floorUV ).xy.mul( 2 ).sub( 1 ).mul( .02 );//反射 const reflection = reflector( { resolution: 0.5 } ); // 0.5 is half of the rendering view  0.5是渲染视图的一半reflection.target.rotateX( - Math.PI / 2 );reflection.uvNode = reflection.uvNode.add( floorNormalOffset );scene.add( reflection.target );//地面材质const floorMaterial = new MeshPhongNodeMaterial();floorMaterial.colorNode = texture( floorColor, floorUV ).add( reflection );const floor = new THREE.Mesh( new THREE.BoxGeometry( 50, .001, 50 ), floorMaterial );floor.position.set( 0, 0, 0 );scene.add( floor );// renderer  渲染器renderer = new WebGPURenderer( { antialias: true } );renderer.setPixelRatio( window.devicePixelRatio );//setPixelRatio 设置设备像素比。通常用于避免HiDPI设备上绘图模糊//setSize 将输出canvas的大小调整为(width, height)并考虑设备像素比,且将视口从(0, 0)开始调整到适合大小 将updateStyle设置为false以阻止对canvas的样式做任何改变。renderer.setSize( window.innerWidth, window.innerHeight );renderer.setAnimationLoop( animate );document.body.appendChild( renderer.domElement );//性能检测stats = new Stats();document.body.appendChild( stats.dom );//控制器controls = new OrbitControls( camera, renderer.domElement );controls.minDistance = 1;//你能够将相机向内移动多少controls.maxDistance = 10;//你能够将相机向外移动多少controls.maxPolarAngle = Math.PI / 2;//你能够垂直旋转的角度的下限,范围是0到Math.PI,其默认值为0controls.autoRotate = true;//将其设为true,以自动围绕目标旋转。请注意,如果它被启用,你必须在你的动画循环里调用.update()controls.autoRotateSpeed = 1;//当.autoRotate为true时,围绕目标旋转的速度将有多快,默认值为2.0,相当于在60fps时每旋转一周需要30秒controls.target.set( 0, .5, 0 );//控制器的焦点,.object的轨道围绕它运行。 它可以在任何时候被手动更新,以更改控制器的焦点controls.update();//更新控制器。必须在摄像机的变换发生任何手动改变后调用// post-processing 屏幕后处理const scenePass = pass( scene, camera );const scenePassColor = scenePass.getTextureNode();//颜色const scenePassDepth = scenePass.getDepthNode().remapClamp( .3, .5 ); //深度const scenePassColorBlurred = scenePassColor.gaussianBlur();scenePassColorBlurred.directionNode = scenePassDepth;const vignet = viewportTopLeft.distance( .5 ).mul( 1.35 ).clamp().oneMinus();postProcessing = new PostProcessing( renderer );//后处理postProcessing.outputNode = scenePassColorBlurred.mul( vignet );//window.addEventListener( 'resize', onWindowResize );}function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );}function animate() {stats.update();controls.update();const delta = clock.getDelta();if ( model ) {mixer.update( delta );//动画更新}postProcessing.render();//后期渲染}</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简析“请求头”——可以用“头部字典”按需定制请求头

请求头是HTTP请求的重要部分&#xff0c;可以用“头部字典”按需定制请求头。 (笔记模板由python脚本于2024年07月12日 19:28:44创建&#xff0c;本篇笔记适合喜欢钻研web知识点的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

RSA算法(C++)

RSA加解密过程 RSA为非对称加密算法&#xff0c;由一对公钥和一对私钥构成&#xff0c;私钥加密公钥解密&#xff0c;公钥加密私钥解密 如下图,D为私密的&#xff0c;假设传输英文字母&#xff0c;我们给英文字母编号A1,B2,C3… RSA加解密过程 两对密钥产生方法如下 C Op…

【RHCE】基于密钥的身份验证(Win-Linux)

目的&#xff1a;要提⾼系统安全性&#xff0c;通过在 OpenSSH 服务器上禁⽤密码⾝份验证来强制进⾏基于密钥的⾝份验证。 1、一台虚拟机无需密码连接另一台虚拟机 .ssh目录 > 保存了ssh相关的key和一些记录文件 &#xff08;1&#xff09;生成密钥对 使⽤这个流程在本地…

U盘打不开的终极解决方案:原因剖析、恢复策略与预防之道

U盘困境&#xff1a;打不开的焦虑与应对 在数字化时代&#xff0c;U盘作为数据交换与存储的重要工具&#xff0c;几乎成为了每个人工作、学习和生活中的必需品。然而&#xff0c;当您满怀期待地将U盘插入电脑&#xff0c;却遭遇“无法识别”、“无法访问”等提示&#xff0c;U…

【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)

​​​​​​​ 目录 一、引言 二、音频分类&#xff08;audio-classification&#xff09; 2.1 概述 2.2 技术原理 2.2.1 Wav2vec 2.0模型 2.2.1 HuBERT模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.4 pipeline实战 2.4.1 …

【Qt 基础】Qt Creator 的初步使用、创建项目的过程

文章目录 1. Qt SDK 中工具程序的介绍2. 创建第一个 Qt 项目的前置步骤 1. Qt SDK 中工具程序的介绍 下载之后会出现下面几个程序&#xff1a; Assistant 表示 Qt 自带的离线官方文档&#xff1b; Designer &#xff1a;Qt设计师&#xff0c;图形化的设计界面的工具&#xf…

C++程序进阶学习

目录 引言 C内存分区 一、内存分区模型 二、 程序运行前 三、程序执行后 C引用 引用的语法 作用 本质 优点 C封装 C对象特性 C对象模型和this指针 C友元 C运算符重载 C继承 C多态 C文件 引言 看过我博客的朋友可能都了解这篇文章内容了&#xff0c;这篇博…

超声波清洗机哪家好?家用超声波眼镜清洗机推荐

超声波清洗机现在已经成为了很多家庭的新宠&#xff0c;它能够帮助我们轻松解决日常生活中的清扫烦恼。但是&#xff0c;面对市面上品种繁多的清洗机产品&#xff0c;我们该如何选择一款适合自己的呢?毕竟不同的品牌和型号&#xff0c;在清洗效果、噪音水平、除菌能力等方面都…

RHCE-autofs自动挂载

要求 一、在主机上提供web&#xff0c;dns服务 服务端 IP&#xff1a;172.25.250.131/24 dns&#xff1a;172.25.250.131 [rootlocalhost ~]# cd /etc/httpd/conf.d[rootlocalhost conf.d]# vim vhost.conf [rootlocalhost conf.d]# mkdir /nfs/rhce -p[rootlocalhost conf…

雪深监测站的工作原理

TH-TS200雪深监测站是一种用于测量和记录雪层深度的设备&#xff0c;它在气象观测、交通管理、防灾减灾、水源管理等多个领域发挥着重要作用。雪深监测用来监测雪深的设备。它通过各种传感器和测量设备&#xff0c;如超声波测距仪、激光测距仪、压力传感器等&#xff0c;获取雪…

若依安装和初始化教程(傻瓜教程 一步一步走)

1、若依的安装&#xff1a; 1、找到若依官方网站并选择若依的前后端分离版本 2、点击克隆 然后选择http进行复制 3、打开idea 如果有打开的项目就先关闭项目&#xff0c;然后就会自动弹出下面第二张图片&#xff0c;接着按照流程走就可以 到此若依的下载就成功了 2、若依项目…

如何判断代码是否是在UPDATE TASK的Session中执行?

1. 背景 有时我们想控制ABAP代码在UPDATE TASK中的逻辑&#xff0c;例如某些逻辑执行&#xff0c;某些逻辑不执行。 那么&#xff0c;我们应该如何判断当前代码运行的环境呢&#xff1f;也即&#xff0c;怎么知道一段运行时代码是运行在当前的ABAP session中&#xff0c;还是…

IDEA设置代码提示忽略大小写

一、设置代码提示为忽略大小写 IDEA代码提示默认是区分大小写的&#xff0c;设置为提示忽略大小写&#xff1a; Setting——Editor——Code Completion 如图

智慧金融-数据可视化

智慧金融-数据可视化 导入所需的库 import numpy as np import numpy_financial as npf import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif][FangSong] mpl.rcParams[axes.unicode_minus]False单图曲线图 r 0.05 # 贷款的年利率 n 30…

字符串哈希详解,单hash,双hash,滚动哈希

一、字符串哈希 1.1 基本概念 字符串哈希 将不同的字符串映射成不同的整数。 思想&#xff1a;将字符串映射成一个 p进制数字。 我们定义如下哈希函数&#xff1a; h a s h ( s ) ∑ i 1 n s [ i ] p n − i ( m o d M ) 其中 s 为长度为 n 的字符串&#xff0c;下标从…

【考研408操作系统】最容易理解的知识体系-文件管理-面向人类管理

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 我将以全新的视角用两篇文章梳理完考研计算机当中关于“文件管理”这个部分的考点的所有内容 以下是我整理的知识点思维导图 目录 我将以全新的视角用两篇文章梳理完考研…

代码随想录算法训练营第三十天

56. 合并区间 这道题跟452. 用最少数量的箭引爆气球 (opens new window)和 435. 无重叠区间 (opens new window)都是一个套路。 回了上面两个这道题并不难 这题主要就是发现重叠后更新一下当前元素的起始范围 if (intervals[i][0] < intervals[i-1][1]) {intervals[i][0…

和鲸101计划夏令营火热进行中!北中医助阵医学数据探索

上周&#xff0c;和鲸社区 2024 夏令营已经正式开营&#xff01; 从 2021 年开始&#xff0c;和鲸社区在每年暑假期间都会为大家提供集中化、系统化的数据科学相关的技能实践和培训&#xff0c;每年都有几千名同学借此机会积累宝贵的实战经验&#xff0c;丰富个人简历作品&…

DR模式介绍

DR模式 lvs的三种模式 nat&#xff1a;地址转换 DR模式&#xff1a;直接路由模式 tun&#xff1a;隧道模式 DR模式的特点 调度器在整个lvs集群当中是最重要的&#xff0c;在nat模式下&#xff0c;即负责接受请求&#xff0c;同时根据负载均衡的算法转发流量&#xff0c;响…

2025 百度提前批校招内推

百度2025校园招聘内推开始啦&#xff0c;被推荐人可以免笔试直接面试&#xff0c;提前批结果不影响校招&#xff0c;机会1&#xff0c;还可直推心仪部门&#xff0c;可扫描下面二维码或点击链接进行投递&#xff0c;快来投递你心仪的职位吧&#xff08; 网申链接地址 &#xff…