使用BabylonJS 的简略笔记

Light:
var light = new BABYLON. HemisphericLight( "light1", new BABYLON. Vector3( 0, 1, 0), scene);//环境光
var light1 = new BABYLON.DirectionalLight( 'light1', new BABYLON.Vector3( 0, 3, 0), scene);//太阳光 直射光
light. intensity = 1;//灯光强度

Camera:
var camera = new BABYLON.ArcRotateCamera("Camera", 2.9( alpha), 1.29( beta), 100( radius), BABYLON.Vector3.Zero()( target), scene);// 绕指定的目标进行旋转的第三人称观察型摄像机


camera. attachControl( canvas, true);//让 canvas使用相机

//限制相机放大缩小 最大及最小距离
camera. lowerRadiusLimit = 10;
camera. upperRadiusLimit = 150;
camera. minZ = 1.0; //限制相机穿进物体
camera. upperBetaLimit = Math.PI / 2;//限制初始旋转角度 旋转和物体平行则停止
camera. setPosition( cameranextpos)  //设置相机初始位置
camera.layerMask = 2; //设置相机层级显示

camerapos = BABYLON. Vector3. Lerp( camerapos, cameranextpos, smooth);//相机移动到下一个点的差值

camera. mode = BABYLON. Camera. ORTHOGRAPHIC_CAMERA;//相机模式改正交相机
camera. orthoTop = 20;
camera. orthoBottom = - 20;
camera. orthoLeft = - 30;
camera. orthoRight = 30;

Material:
var planTexture  = new BABYLON. Texture( "./static/textures/qinru/chuanglian.png", scene);
var materialPlane  = new BABYLON. StandardMaterial( "texturePlane", scene);
materialPlane. diffuseTexture = materialPlane;//普通贴图
materialPlane.diffuseTexture.hasAlpha = true;//透明贴图显示透明效果
materialPlane. specularColor = new BABYLON. Color3( 0, 0, 0);//高光贴图
materialPlane. backFaceCulling = false;//面片背面也渲染

//支持带有渐变的透明贴图效果
materialPlane. opacityTexture = materialPlane;
materialPlane. needDepthPrePass = true;

//逐帧动画
var count = 0;
var textureArry=[];
for( var i= 0; i<= 420; i++){
  textureArry[ i]= new BABYLON. Texture( "static/textures/gaoqing_xulie/Vulcano_" + i + ".png");
}
function aniamtionOneByOne() {
  SET= setTimeout(()=>{
    if( count > 420 ) {
      clearTimeout( SET);
      count = 420;
      mesh_pf. material. diffuseTexture = textureArry[ count];
      isPlay = false;
      haveTransition = false;
      return;
    }
    mesh_pf. material. diffuseTexture = textureArry[ count];
    count++;
    aniamtionOneByOne();
  }, 30);
}
clearTimeout( SET);//清除

//帧动画
function  modelShowAnimation(mesh) {
  var animation = new BABYLON. Animation( "myAnimation", "material.alpha", 30, BABYLON. Animation. ANIMATIONTYPE_FLOAT, BABYLON. Animation. ANIMATIONLOOPMODE_CYCLE);
  var keys = [];
  keys. push({
    frame: 0,
    value: 0
  });
  keys. push({
    frame: 100,
    value: 1
  });
  animation. setKeys( keys);
  mesh. animations = [];
  mesh. animations. push( animation);
  pf_animation = scene. beginAnimation(mesh, 0, 100, false, 4,()=>{
    aniamtionOneByOne();
  });
}

GUI:
var advancedTexture = BABYLON. GUI. AdvancedDynamicTexture. CreateFullscreenUI( "ui1");
function createLabel(mesh,name,texture) {
    var label = new BABYLON. GUI. Rectangle( "label for " + mesh. name);
    label. background = "#363636";
    label. height = "30px";
    label. alpha = 0.8;
    label. width = "30px";
    label. cornerRadius = 5;
    label. thickness = 2;
    advancedTexture. addControl( label);
    label. linkWithMesh(mesh);
    var text1 = new BABYLON. GUI. TextBlock();
    text1. text = name;
    text1. color = "white";
    text1. fontSize= "15";
    label. addControl( text1);
    return label;
}

//加载模型          this. strData2->babylon格式模型json数据
BABYLON. SceneLoader. ImportMesh( "", "", "data:" + this. strData2, scene, function (newMeshes, particleSystems, skeletons) {
  for ( var i = 0; i < newMeshes. length; i++) {
    newMeshes[ i]. isVisible = true;
    if (!newMeshes[ i]. rotationQuaternion) {
      newMeshes[ i]. rotationQuaternion = BABYLON. Quaternion. RotationYawPitchRoll(newMeshes[ i]. rotation. y, newMeshes[ i]. rotation. x, newMeshes[ i]. rotation. z);
      newMeshes[ i]. rotation = BABYLON. Vector3. Zero();
      newMeshes[ i]. scaling = new BABYLON. Vector3( 1, 1, 1);
      newMeshes[ i]. position = BABYLON. Vector3. Zero();
      newMeshes[ i]. material = materialPlane1;//指定材质
    }
  }
}); 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用LZMA SDK对7z文件进行解压缩,需要先了解7z文件的结构。7z文件实际上是一个压缩文件,其中包含多个压缩数据块和一个头文件,头文件中包含了每个压缩数据块的信息。因此,我们需要先读取头文件,然后逐个解压数据块。 以下是一个简略的C语言例程,用于对7z文件进行解压缩: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <lzma.h> #define LZMA_PROPERTIES_SIZE 5 int main(int argc, char *argv[]) { if (argc < 3) { printf("Usage: %s input_file output_dir\n", argv[0]); return 1; } char *input_filename = argv[1]; char *output_dirname = argv[2]; // 打开输入文件 FILE *input_file = fopen(input_filename, "rb"); if (input_file == NULL) { printf("Error: Failed to open input file.\n"); return 1; } // 读取7z头文件 uint8_t header[32]; if (fread(header, 1, 32, input_file) != 32) { printf("Error: Failed to read 7z header.\n"); fclose(input_file); return 1; } // 验证7z头文件 if (memcmp(header, "\x37\x7A\xBC\xAF\x27\x1C", 6) != 0) { printf("Error: Invalid 7z header.\n"); fclose(input_file); return 1; } // 获取7z头文件信息 uint8_t properties[LZMA_PROPERTIES_SIZE]; uint64_t header_size; lzma_stream_flags flags; memcpy(properties, header + 6, LZMA_PROPERTIES_SIZE); header_size = *(uint64_t *)(header + 13); flags = *(lzma_stream_flags *)(header + 21); // 初始化LZMA解压缩器 lzma_stream lzma_strm = LZMA_STREAM_INIT; lzma_ret ret = lzma_stream_decoder(&lzma_strm, UINT64_MAX, LZMA_CONCATENATED); if (ret != LZMA_OK) { printf("Error: Failed to initialize LZMA decoder.\n"); fclose(input_file); return 1; } // 创建输出目录 char output_filename[256]; sprintf(output_filename, "%s/", output_dirname); mkdir(output_filename, 0777); // 分配输入输出缓冲区 uint8_t *input_buf = malloc(flags.dict_size); uint8_t *output_buf = malloc(LZMA_BUFLEN); if (input_buf == NULL || output_buf == NULL) { printf("Error: Failed to allocate memory.\n"); free(input_buf); free(output_buf); lzma_end(&lzma_strm); fclose(input_file); return 1; } // 解压缩数据块 uint64_t offset = header_size; uint64_t uncompressed_size = 0; while (1) { // 读取数据块头信息 uint8_t block_header[17]; if (fread(block_header, 1, 17, input_file) != 17) { printf("Error: Failed to read block header.\n"); break; } // 获取数据块信息 uint64_t block_size = *(uint64_t *)(block_header + 1); uint8_t block_type = block_header[9]; // 设置LZMA输入缓冲区 lzma_strm.next_in = input_buf; lzma_strm.avail_in = block_size; // 设置LZMA输出缓冲区 lzma_strm.next_out = output_buf; lzma_strm.avail_out = LZMA_BUFLEN; // 解压数据块 while (1) { ret = lzma_code(&lzma_strm, LZMA_RUN); if (ret != LZMA_OK && ret != LZMA_STREAM_END) { printf("Error: Failed to decode LZMA data.\n"); free(input_buf); free(output_buf); lzma_end(&lzma_strm); fclose(input_file); return 1; } fwrite(output_buf, 1, lzma_strm.next_out - output_buf, output_file); lzma_strm.next_out = output_buf; lzma_strm.avail_out = LZMA_BUFLEN; if (ret == LZMA_STREAM_END) { break; } } // 更新偏移量和解压缩大小 offset += block_size + 17; uncompressed_size += *(uint64_t *)(block_header + 10); // 如果解压缩大小等于文件大小,则说明解压缩完成 if (uncompressed_size >= flags.uncompressed_size) { break; } } // 释放资源 free(input_buf); free(output_buf); lzma_end(&lzma_strm); fclose(input_file); printf("Done.\n"); return 0; } ``` 这个例程通过LZMA SDK提供的API实现了7z文件的解压缩功能。在解压缩过程中,我们需要先读取7z头文件,然后逐个解压缩数据块。在解压缩数据块时,我们需要先读取数据块头信息,然后设置LZMA输入输出缓冲区,调用`lzma_code`函数解压缩数据,最后写入输出文件。在解压缩完成后,我们需要调用`lzma_end`函数释放资源。 注意:这个例程仅适用于对单个7z文件进行解压缩。如果需要解压缩多个7z文件,需要先读取7z头文件,然后逐个解压缩7z文件中的数据块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值