tag 标签: 23年

相关资源
  • 所需E币: 0
    时间: 2023-12-11 14:51
    大小: 3.47KB
    Three.js是一个3DJavaScript库,它可以帮助你为网络创造3D体验,而且非常容易使用。如果你想让你的网站更加炫酷,那么Three.js一定是你的好帮手。Three.js是一个在MIT许可下的JavaScript库,它在WebGL之上运行。这个库的目标就是简化处理3D内容的过程。只需要几行代码,你就可以获得一个动画3D场景,而且你无需了解复杂的着色器和矩阵。要在屏幕上展示3D图形,思路大体上都是这样的:1、构建一个三维空间Three中称之为场景(Scene)2、选择一个观察点,并确定观察方向/角度等Three中称之为相机(Camera)3、在场景中添加供观察的物体Three中的物体有很多种,包括Mesh,Line,Points等,它们都继承自Object3D类4、将观察到的场景渲染到屏幕上的指定区域Three中使用Renderer完成这一工作不同服务之间的通信可以采用restTemplate来进行通信调用,当然使用httpClient来构建也是可以的。com.imooc.api.config.CloudConfig.java@AutowiredprivateRestTemplaterestTemplate;//判断faceId不为空,为空直接返回登录失败//2.请求文件服务,获取人脸的base64信息StringfileServerUrlExecute="http://files.imoocnews.com:8004/fs/readFace64InGridFS?faceId="+adminFaceId;ResponseEntity<GraceJSONResult>resultEntity=restTemplate.getForEntity(fileServerUrlExecute,GraceJSONResult.class);GraceJSONResultgraceJSONResult=resultEntity.getBody();Stringbase64DB=(String)graceJSONResult.getData();//    System.out.println("restTemplate远程调用获得的内容为:"+base64);returnGraceJSONResult.ok();com.imooc.admin.controller.FriendLinkMngController.java@RestControllerpublicclassFriendLinkMngControllerextendsBaseControllerimplementsFriendLinkMngControllerApi{  finalstaticLoggerlogger=LoggerFactory.getLogger(FriendLinkMngController.class);  @Override  publicGraceJSONResultsaveOrUpdateFriendLink(SaveFriendLinkBOsaveFriendLinkBO,                         BindingResultresult){//    System.out.println(saveFriendLinkBO.toString());    //判断BindingResult是否保存错误的验证信息,如果有,则直接return    if(result.hasErrors()){      Map<String,String>errorMap=getErrors(result);      returnGraceJSONResult.errorMap(errorMap);    }    //保存到MongoDB    FriendLinkMOfriendLinkMO=newFriendLinkMO();    BeanUtils.copyProperties(saveFriendLinkBO,friendLinkMO);    friendLinkMO.setCreateTime(newDate());    friendLinkMO.setUpdateTime(newDate());           returnGraceJSONResult.ok();  }}下面我们用一个简单的例子来梳理一下这个过程。首先写一个有Canvas元素的页面吧。@Document(collection="friend_link")publicclassFriendLinkMO{  /**   *@Id自定义Id主键,mongodb的文档id不会自动生成,会使用我们设置的id值   */  @Id  privateStringid;  @Field("link_name")  privateStringlinkName;  @Field("link_url")  privateStringlinkUrl;  @Field("is_delete")  privateIntegerisDelete;  @Field("create_time")  privateDatecreateTime;  @Field("update_time")  privateDateupdateTime;  //gettersetter...}@ServicepublicclassAppUserMngServiceImplimplementsAppUserMngService{  @Autowired  publicAppUserMapperappUserMapper;  @Override  publicPagedGridResultqueryAllUserList(Stringnickname,Integerstatus,                      DatestartDate,DateendDate,                      Integerpage,IntegerpageSize){    ExampleuserExample=newExample(AppUser.class);    userExample.orderBy("createdTime").desc();    Example.Criteriacriteria=userExample.createCriteria();    if(StringUtils.isNotBlank(nickname)){      criteria.andLike("nickname","%"+nickname+"%");    }    if(UserStatus.isUserStatusValid(status)){      criteria.andEqualTo("activeStatus",status);    }    if(startDate!=null){      criteria.andGreaterThanOrEqualTo("createdTime",startDate);    }    if(endDate!=null){      criteria.andLessThanOrEqualTo("createdTime",endDate);    }    PageHelper.startPage(page,pageSize);    List<AppUser>list=appUserMapper.selectByExample(userExample);    returnsetterPagedGrid(list,page);  }}要唯一确定一个相机的位置与方向,position、up、lookAt三个属性是缺一不可的。这里我们创建了一个正交投影相机,这里我将视景体大小与屏幕分辨率保持一致只是为了方便,这样坐标系中的一个单位长度就对应屏幕的一个像素了。我们将相机放在Z轴上,面向坐标原点,相机的上方向为Y轴方向,注意up的方向和lookAt的方向必然是垂直的(类比自己的头就知道了)。下面添加一个立方体到场景中:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.imooc.article.mapper.ArticleMapperCustom">  <updateid="updateAppointToPublish">    UPDATE     article    SET     is_appoint=0    WHERE      publish_time&lt;=NOW()     and      is_appoint=1  </update></mapper>three.js中的三大要素:场景(scene)、相机(camera)、衬着器(renderer),有了这三样东西,我们才能够运用相机将场景衬着到网页上去。@OverridepublicGraceJSONResultqueryMyList(StringuserId,Stringkeyword,                  Integerstatus,                  DatestartDate,DateendDate,                  Integerpage,IntegerpageSize){  if(StringUtils.isBlank(userId)){    returnGraceJSONResult.errorCustom(ResponseStatusEnum.ARTICLE_QUERY_PARAMS_ERROR);  }  if(page==null){    page=COMMON_START_PAGE;  }  if(pageSize==null){    pageSize=COMMON_PAGE_SIZE;  }  PagedGridResultgridResult=articleService.queryMyArticleList(userId,                                  keyword,                                  status,                                  startDate,                                  endDate,                                  page,                                  pageSize);  returnGraceJSONResult.ok(gridResult);}首先可以在数据库通过写sql脚本实现查询SELECTc.idascommentId,c.father_idasfatherId,c.article_idasarticleId,c.comment_user_idascommentUserId,c.comment_user_nicknameascommentUserNickname,c.contentascontent,c.create_timeascreateTime,f.comment_user_nicknameasquoteUserNickname,f.contentasquoteContentFROMcommentscLEFTJOINcommentsfonc.father_id=f.idWHEREc.article_id='2006117B57WRZGHH'orderbyc.create_timedesc
  • 所需E币: 0
    时间: 2023-11-27 11:13
    大小: 5.15KB
    上传者: 开心就很好了
    自动驾驶是高安全型应用,需要高性能和高可靠的深度学习模型,VisionTransformer是理想的选摔。现在主流的自动驾驶感知算法基本都使用了VisionTransformer相关技术,比如分割、2D/3D检测,以及最近大火的大模型(如SAM),VisionTransformer在自动驾驶领域的落地方面遍地开花。5一方面,在自动驾驶或图像处理相关算法岗位的面试题中,VisionTransformer是必考题,需要对其理论知识有深入理解,并且在项目中真实的使用过相关技术。Transformer出自于Google于2017年发表的论文《Attentionisallyouneed》,最开始是用于机器翻译,并且取得了非常好的效果。但是自提出以来,Transformer不仅仅在NLP领域大放异彩,并且在CV、RS等领域也取得了非常不错的表现。尤其是2020年,绝对称得上是Transformer的元年,比如在CV领域,基于Transformer的模型横扫各大榜单,完爆基于CNN的模型。为什么Transformer模型表现如此优异?它的原理是什么?它成功的关键又包含哪些?本文将简要地回答一下这些问题。我们知道Transformer模型最初是用于机器翻译的,机器翻译应用的输入是某种语言的一个句子,输出是另外一种语言的句子。vari*int=nilfmt.Println("i.size:",unsafe.Sizeof(i))//8vari8*int8=nilfmt.Println("i8.size:",unsafe.Sizeof(i8))//8vars*string=nilfmt.Println("s.size:",unsafe.Sizeof(s))//8varps*struct{}=nilfmt.Println("ps.size:",unsafe.Sizeof(ps))//8varsi[]int=nilvarsi1[]int=nilfmt.Println("si.size:",unsafe.Sizeof(si))//24variiinterface{}=nilfmt.Println("ii.size:",unsafe.Sizeof(ii))//16我们以生成我,爱,机器,学习,翻译成<bos>,i,love,machine,learning,<eos>这个例子做生成过程来解释。训练:把“我/爱/机器/学习”embedding后输入到encoder里去,最后一层的encoder最终输出的outputs[10,512](假设我们采用的embedding长度为512,而且batchsize=1),此outputs乘以新的参数矩阵,可以作为decoder里每一层用到的K和V;将<bos>作为decoder的初始输入,将decoder的最大概率输出词向量A1和‘i’做crossentropy(交叉熵)计算error。将<bos>,“i”作为decoder的输入,将decoder的最大概率输出词A2和‘love’做crossentropy计算error。将<bos>,“i”,“love”作为decoder的输入,将decoder的最大概率输出词A3和’machine’做crossentropy计算error。将<bos>,“i”,"love",“machine”作为decoder的输入,将decoder最大概率输出词A4和‘learning’做crossentropy计算error。将<bos>,“i”,"love",“machine”,“learning”作为decoder的输入,将decoder最大概率输出词A5和终止符做crossentropy计算error。那么并行的时候是怎么做的呢,我们会有一个mask矩阵在这叫seqmask,因为他起到的作用是在decoder编码我们的targetseq的时候对每一个词的生成遮盖它之后的词的信息。funcmain(){s:=[]string{"a","b","c"}fmt.Println("s:origin",s)changes1(s)fmt.Println("s:f1",s)changes2(s)fmt.Println("s:f2",s)changes3(s)fmt.Println("s:f3",s)}funcchanges1(s[]string){vartmp=[]string{"x","y","z"}s=tmp}funcchanges2(s[]string){//item只是一个副本,不能改变s中元素的值fori,item:=ranges{item="d"fmt.Printf("item=%s;s[%d]=%s",item,i,s[i])}}funcchanges3(s[]string){fori:=ranges{s[i]="d"}}首先我们需要为每个输入向量(也就是词向量)创建3个向量,分别叫做Query、Key、Value。那么如何创建呢?我们可以对输入词向量分别乘上3个矩阵来得到Q、K、V向量,这3个矩阵的参数在训练的过程是可以训练的。注意Q、K、V向量的维度是一样的,但是它们的维度可以比输入词向量小一点,比如设置成64,其实这步也不是必要的,这样设置主要是为了与后面的Mulit-head注意力机制保持一致(当使用8头注意力时,单头所处理的词向量维度为512/8=64,此时Q、K、V向量与输入词向量就一致了)。我们假设输入序列为英文的"ThinkingMachines"想要深度理解Attention机制,就需要了解一下它产生的背景、在哪类问题下产生,以及最初是为了解决什么问题而产生。首先回顾一下机器翻译领域的模型演进历史:机器翻译是从RNN开始跨入神经网络机器翻译时代的,几个比较重要的阶段分别是:SimpleRNN,ContextualizeRNN,ContextualizedRNNwithattention,Transformer(2017),下面来一一介绍。「SimpleRNN」:这个encoder-decoder模型结构中,encoder将整个源端序列(不论长度)压缩成一个向量(encoderoutput),源端信息和decoder之间唯一的联系只是:encoderoutput会作为decoder的initialstates的输入。这样带来一个显而易见的问题就是,随着decoder长度的增加,encoderoutput的信息会衰减。funcmain(){varc=make(chanint)fmt.Printf("c.pointer=%p\n",c)//c.pointer=0xc000022180gofunc(){c<-1addChannel(c)close(c)}()foritem:=rangec{//item:1//item:2fmt.Println("item:",item)}}funcaddChannel(donechanint){done<-2fmt.Printf("done.pointer=%p\n",done)//done.pointer=0xc000022180}在测试模型的时候,Test:decoder没有label,采用自回归一个词一个词的输出,要翻译的中文正常从encoder并行输入(和训练的时候一样)得到每个单词的embedding,然后decoder第一次先输入bos再此表中的id,得到翻译的第一个单词,然后自回归,如此循环直到预测达到eos停止标记typevisitstruct{a1 unsafe.Pointera2 unsafe.PointertypType}funcdeepValueEqual(v1,v2Value,visitedmap[visit]bool)bool{if!v1.IsValid()||!v2.IsValid(){returnv1.IsValid()==v2.IsValid()}ifv1.Type()!=v2.Type(){returnfalse}//Wewanttoavoidputtingmoreinthevisitedmapthanweneedto.//Foranypossiblereferencecyclethatmightbeencountered,//hard(v1,v2)needstoreturntrueforatleastoneofthetypesinthecycle,//andit'ssafeandvalidtogetValue'sinternalpointer.hard:=func(v1,v2Value)bool{switchv1.Kind(){casePointer:ifv1.typ.ptrdata==0{//not-in-heappointerscan'tbecyclic.//Atleast,allofourcurrentusesofruntime/internal/sys.NotInHeap//havethatproperty.Theruntimeonesaren'tcyclic(andwedon'tuse//DeepEqualonthemanyway),andthecgo-generatedonesare//allemptystructs.returnfalse}fallthroughcaseMap,Slice,Interface://Nilpointerscannotbecyclic.Avoidputtingtheminthevisitedmap.return!v1.IsNil()&&!v2.IsNil()}returnfalse}ifhard(v1,v2){//ForaPointerorMapvalue,weneedtocheckflagIndir,//whichwedobycallingthepointermethod.//ForSliceorInterface,flagIndirisalwaysset,//andusingv.ptrsuffices.ptrval:=func(vValue)unsafe.Pointer{switchv.Kind(){casePointer,Map:returnv.pointer()default:returnv.ptr}}addr1:=ptrval(v1)addr2:=ptrval(v2)ifuintptr(addr1)>uintptr(addr2){//Canonicalizeordertoreducenumberofentriesinvisited.//Assumesnon-movinggarbagecollector.addr1,addr2=addr2,addr1}//Shortcircuitifreferencesarealreadyseen.typ:=v1.Type()v:=visit{addr1,addr2,typ}ifvisited[v]{returntrue}//Rememberforlater.visited[v]=true}switchv1.Kind(){caseArray:fori:=0;i<v1.Len();i++{if!deepValueEqual(v1.Index(i),v2.Index(i),visited){returnfalse}}returntruecaseSlice:ifv1.IsNil()!=v2.IsNil(){returnfalse}ifv1.Len()!=v2.Len(){returnfalse}ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}//Specialcasefor[]byte,whichiscommon.ifv1.Type().Elem().Kind()==Uint8{returnbytealg.Equal(v1.Bytes(),v2.Bytes())}fori:=0;i<v1.Len();i++{if!deepValueEqual(v1.Index(i),v2.Index(i),visited){returnfalse}}returntruecaseInterface:ifv1.IsNil()||v2.IsNil(){returnv1.IsNil()==v2.IsNil()}returndeepValueEqual(v1.Elem(),v2.Elem(),visited)casePointer:ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}returndeepValueEqual(v1.Elem(),v2.Elem(),visited)caseStruct:fori,n:=0,v1.NumField();i<n;i++{if!deepValueEqual(v1.Field(i),v2.Field(i),visited){returnfalse}}returntruecaseMap:ifv1.IsNil()!=v2.IsNil(){returnfalse}ifv1.Len()!=v2.Len(){returnfalse}ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}for_,k:=rangev1.MapKeys(){val1:=v1.MapIndex(k)val2:=v2.MapIndex(k)if!val1.IsValid()||!val2.IsValid()||!deepValueEqual(val1,val2,visited){returnfalse}}returntruecaseFunc:ifv1.IsNil()&&v2.IsNil(){returntrue}//Can'tdobetterthanthis:returnfalsecaseInt,Int8,Int16,Int32,Int64:returnv1.Int()==v2.Int()caseUint,Uint8,Uint16,Uint32,Uint64,Uintptr:returnv1.Uint()==v2.Uint()caseString:returnv1.String()==v2.String()caseBool:returnv1.Bool()==v2.Bool()caseFloat32,Float64:returnv1.Float()==v2.Float()caseComplex64,Complex128:returnv1.Complex()==v2.Complex()default://NormalequalitysufficesreturnvalueInterface(v1,false)==valueInterface(v2,false)}}这便是encoder的整体计算流程图了,Transformer模型中堆叠了多个这样的encoder,无非就是输出连接输入罢了,常规操作。最后再附上一个Transformer的代码实现,读者有兴趣可以跟着自己复现一下Transformer模型的代码。  packagemain  import(    "log"    "sync"  )  funcinit(){    log.SetFlags(log.Lshortfile)  }  funcmain(){    lock:=sync.Mutex{}    //Go1.18新增,是一种非阻塞模式的取锁操作。当调用TryLock()时,    //该函数仅简单地返回true或者false,代表是否加锁成功    //在某些情况下,如果我们希望在获取锁失败时,并不想停止执行,    //而是可以进入其他的逻辑就可以使用TryLock()    log.Println("TryLock:",lock.TryLock())    //已经通过TryLock()加锁,不能再次加锁    lock.Lock()  }
  • 所需E币: 0
    时间: 2023-10-19 09:00
    大小: 2.09KB
    上传者: huangyasir1990
    大数据工程师2023版体系课,10月升级版35周,源码+PDF课件+电子手册+软件下载地址+接口数据集下载!大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。简单来说,大数据就是结构化的传统数据再加上非结构化的新数据。大数据作为时下最火热的IT行业的词汇,随之而来的数据仓库、数据安全、数据分析、数据挖掘等等围绕大数据的商业价值的利用逐渐成为行业人士争相追捧的利润焦点。随着大数据时代的来临,大数据分析也应运而生。大数据包含哪些技术:Zookeeper是一个分布式的、开放源码的分布式应用程序协调服务,提供数据同步服务。它的作用主要有配置管理、名字服务、分布式锁和集群管理。配置管理指的是在一个地方修改了配置,那么和这个地方配置相同的所有地方都可以获得变更,省去了手动拷贝配置的繁琐,还很好地保证了数据的可靠和一致性,同时它可以通过名字来获取资源或者服务的地址等信息,可以监控集群中机器的变化,实现了类似于心跳机制的功能。Hadoop作为一个开源的框架,专为离线和大规模数据分析而设计,HDFS作为其核心的存储引擎,已被广泛用于数据存储。HBase,是一个分布式的、面向列的开源数据库,可以认为是hdfs的封装,本质是数据存储、NoSQL数据库。HBase是一种Key/Value系统,部署在hdfs上,克服了hdfs在随机读写这个方面的缺点,与Hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。Impala是对Hive的一个补充,可以实现高效的SQL查询。使用Impala来实现SQLonHadoop,用来进行大数据实时查询分析。通常来说,在我们最终查看数据报表,或者使用数据进行算法预测之前,数据都会经历以下这么几个处理环节:数据采集:是指将应用程序产生的数据和日志等同步到大数据系统中。数据存储:海量的数据,需要存储在系统中,方便下次使用时进行查询。数据处理:原始数据需要经过层层过滤、拼接、转换才能最终应用,数据处理就是这些过程的统称。一般来说,有两种类型的数据处理,一种是离线的批量处理,另一种是实时在线分析。数据应用:经过处理的数据可以对外提供服务,比如生成可视化的报表、作为互动式分析的素材、提供给推荐系统训练模型等等。计算机要对输入的单词进行计数:如果采用集中式计算方式,我们要先算出一个单词如Deer出现了多少次,再算另一个单词出现了多少次,直到所有单词统计完毕,将浪费大量的时间和资源。如果采用分布式计算方式,计算将变得高效。我们将数据随机分配给三个节点,由节点去分别统计各自处理的数据中单词出现的次数,再将相同的单词进行聚合,输出最后的结果。
  • 所需E币: 0
    时间: 2023-10-19 10:35
    大小: 3.21KB
    上传者: 开心就很好了
    MK体系课-大数据工程师2023版(35周)分享下载,源码+PDF课件+电子手册+软件下载地址+接口数据集,资料齐全下载!想要学好大数据需掌握以下技术:1.Java编程技术2.Linux命令3.Hadoop4.Hive5.Avro与Protobuf6.ZooKeeper7.HBase8.phoenix9.Redis10.Flume11.SSM12.Kafka13.Scala14.Spark15.Azkaban16.flink下面我们就来学习一下HDFS中的一些常见的shell操作其实hdfs后面支持很多的参数,但是有很多是很少用的,在这里我们把一些常用的带着大家一块学习一下,如果大家后期有一些特殊的需求,可以试着来看一下hdfs的帮助文档直接在命令行中输入hdfsdfs,可以查看dfs后面可以跟的所有参数注意:这里面的[]表示是可选项,<>表示是必填项首先看第一个ls命令查看hdfs根目录下的内容,什么都不显示,因为默认情况下hdfs中什么都没有其实后面hdfs的url这一串内容在使用时默认是可以省略的,因为hdfs在执行的时候会根据HDOOP_HOME自动识别配置文件中的fs.defaultFS属性所以这样简写也是可以的实战:WordCount案例开发前面我们通过理论层面详细分析了单词计数的执行流程,下面我们就来实际上手操作一下。大致流程如下:第一步:开发Map阶段代码第二步:开发Reduce阶段代码第三步:组装Job在idea中创建WordCountJob类添加注释,梳理一下需求:需求:读取hdfs上的hello.txt文件,计算文件中每个单词出现的总次数hello.txt文件内容如下:helloyouhellome最终需要的结果形式如下:hello2me1you1
  • 所需E币: 0
    时间: 2023-10-18 10:44
    大小: 1.86KB
    上传者: 开心就很好了
    [38章]Three.js可视化系统课程WebGL(23年10月最新版+700多课时),视频+源码+课件,全网最全系列!WebGL是一个JavaScriptAPI,用于在任何兼容的Web浏览器中呈现交互式3D图形,而无需使用插件。WebGL应用程序由用JavaScript编写的控制代码和在计算机GPU上执行的特殊效果代码组成。WebGL元素可以与其他HTML元素混合,并与页面或页面背景的其他部分组合。WebGL浏览器报告检查Web浏览器中的WebGL支持,生成WebGL设备指纹识别,并显示其他WebGL和GPU功能或多或少相关的Web浏览器标识。WebGL在使用图片上有着比Canvas2D更强的限制,就是说WebGL不能随意使用网络获图像,还有一点需要注意的是WebGL读取本地数据的速度很快。WebGL1可以看成是OpenGLES2的javascript移植,类似的,WebGL2可以看做是OpenGLES3的javascript移植。所以大部分的特性可以去对应到OpenGLES3中的特性,当然有些细节上会有出入(比如textureswizzle是不支持)。这些新特性除了可以从WebGL2spec中找到,也可以去寻找OpenGLES3的书籍来大略了解。当然我非常推荐到我们的WebGL2SamplesPack去直接寻找新的特性及其用法,一般每个特性都有对应的sample。比较重要的特性有:uniformbufferobjectvertexarrayobjecttransformfeedbackmultisamplefbomultiplerendertargets一系列texture相关:texturelod,texture2darray,texture3d,压缩格式texture等等。WebGL是什么GPU≠WebGL≠2DWebGL是浏览器上的OpenGL需要一定计算机图形学基础和线性代数基础WebGL(全写WebGraphicsLibrary)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGLES2.0结合在一起,通过增加OpenGLES2.0的一个JavaScript绑定,WebGL可以为HTML5Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏等等。和传统的3D方案相比,WebGL具有如下一些优点。WebGL是内嵌在浏览器中的,无需安装插件和库就可以直接使用。可以在多平台上运行WebGL程序。让海量数据的二维可视化成为了可能。开发环境简单,仅需文本编辑器和浏览器就可以编写三维图形程序
  • 所需E币: 0
    时间: 2023-10-13 11:24
    大小: 1.87KB
    [23年10月版46章]Three.js可视化企业实战WEBGL课,随着5G时代的到来,3D可视化需求大量涌现。3D游戏,酷炫的活动宣传页,三维数字城市,VR全景展示、3D产品展示等领域中,很多项目都是用WebGL实现的,也只能用WebGL来做,也就是说,WebGL的时代就在眼前了。WebGL在电脑的GPU中运行。因此你需要使用能够在GPU上运行的代码。这样的代码需要提供成对的方法。每对方法中一个叫顶点着色器,另一个叫片段着色器,并且使用一种和C或C++类似的强类型的语言GLSL。(GL着色语言)。每一对组合起来称作一个program(着色程序)。顶点着色器的作用是计算顶点的位置。根据计算出的一系列顶点位置,WebGL可以对点,线和三角形在内的一些图元进行光栅化处理。当对这些图元进行光栅化处理时需要使用片段着色器方法。片段着色器的作用是计算出当前绘制图元中每个像素的颜色值。Adobe提供的Stage3DAPI(Flash、AIR)提供了GPU硬件加速架构。使用这些技术,程序员可以在Web浏览器以及IOS和Android平台上开发具有2D和3D功能的应用程序。由于Flash是一种专有软件,它没有被用作网络标准。2011年3月,WebGL发布。WebGL是一个无需JVM即可运行的开放软件,它完全由网络浏览器控制。新版本的HTML5具有支持3D图形的多项功能,例如2DCanvas、WebGL、SVG、3DCSS转换和SMIL。渲染过程大概经历了下面这么多过程,因为本篇文章的重点其实是在着色器,所以我重点分析从顶点着色器——片元着色器的一个过程WebGL就是和GPU打交道,在GPU上运行的代码是一对着色器,一个是顶点着色器,另一个是片元着色器。每次调用着色程序都会先执行顶点着色器,再执行片元着色器。一个顶点着色器的工作是生成裁剪空间坐标值,通常是以下的形式:constvertexShaderSource=`  attributevec3position;   voidmain(){    gl_Position=vec4(position,1);   }WebGL工作原理图像渲染其实是前端工程师使用CSS语言,去调用WebGL的API,然后通过WebGL去调用底层的openGL,来达到操作显卡驱动的目的。OpenGL-ESOpenGL-ES是openGL的一个精简版.专用于嵌入式计算机、智能手机、家用游戏机等设备。OpenGLES移除了OpenGL中许多陈旧无用的新特性,并且增加了新特性。这使得OpenGLES保持了轻量级的同时,还有足够的能力渲染出精美的三维图形。
  • 所需E币: 0
    时间: 2023-9-18 16:20
    大小: 703B
    上传者: 蝴蝶结欧恩
    分享课程——Vue3+Vite+Vant-UI开发双端招聘APP,23年新课,完整版32章,附源码下载。课程以业务驱动技术栈,将真正的商用级项目复原在课程中,使用Vite、Vue3、Vant3UI、Pinia和VueUse等前沿技术,从构建、研发、测试,完成整个全流程的学习。让你在掌握技术的同时,也能提升作为开发者的综合素养。项目功能相对完善,界面美观,手把手带你做出亮眼的作品。
  • 所需E币: 0
    时间: 2023-7-5 09:38
    大小: 2.55KB
    上传者: 开心就很好了
    Three.js可视化企业实战WEBGL教程分享下载,2023年7月升级版45章,附源码+课件+素材下载!Three.js是一款运行在浏览器中的3D引擎,你可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。你可以在它的主页上看到许多精采的演示。不过,这款引擎目前还处在比较不成熟的开发阶段,其不够丰富的API以及匮乏的文档增加了初学者的学习难度(尤其是文档的匮乏),《Three.js可视化企业实战WEBGL教程》无疑弥补了这个空缺,课程结合大量实践案例,让您对Three.js有更深入的了解!掌握一些概念性知识1、前端基本功–HTML+CSS+JS,至少会写需要引入入外部JS的单页HTML,本文即使用这种模式编写和实现2、Three.js概念:Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎3、基于Three.js写页面的三要素是:场景(Scene)、相机(Camera)、渲染器(Renderer)为什么选择three.js官网对「Threejs」的介绍非常简单:“Javascript3Dlibrary”。「openGL」是一个跨平台3D/2D的绘图标准,「WebGL」则是「openGL」在浏览器上的一个实现。web前端开发人员可以直接用「WebGL」接口进行编程,但「WebGL」只是非常基础的绘图API,需要编程人员有很多的数学知识、绘图知识才能完成3D编程任务,而且代码量巨大。「Threejs」对「WebGL」进行了封装,让前端开发人员在不需要掌握很多数学知识和绘图知识的情况下,也能够轻松进行web3D开发,降低了门槛,同时大大提升了效率。总结来一句话:就是你不懂计算机图形学,只要理解了three.js的一些基本概念你可以。文章的开头我们就已经说过了,threejs三大妈:场景、相机、渲染器。其中的场景,暂且可以理解为最终我们看到的这个画布。我们首先需要new一个scene对象。然后分别new一个形状和材料实例,通过scene的add方法加入到画布中去。这个过程的实现代码就是下面这几行。逻辑很清晰:我们往场景中塞入了一个球体,然后给这个球体做了点装饰,就是用的“材料”。我们可以设置这个“材料”的颜色、金属强度等一系列的图像学的属性。Build目录:包含两个文件,three.js和three.min.js。这是three.js最终被引用的文件。一个已经压缩,一个没有压缩的js文件。Docs目录:这里是three.js的帮助文档,里面是各个函数的api,可惜并没有详细的解释。试图用这些文档来学会three.js是不可能的。Editor目录:一个类似3D-max的简单编辑程序,它能创建一些三维物体。Examples目录:一些很有趣的例子demo,可惜没有文档介绍。对图像学理解不深入的同学,学习成本非常高。Src目录:源代码目录,里面是所有源代码。Test目录:一些测试代码,基本没用。Utils目录:存放一些脚本,python文件的工具目录。例如将3D-Max格式的模型转换为three.js特有的json模型。.gitignore文件:git工具的过滤规则文件,没有用。CONTRIBUTING.md文件:一个怎么报bug,怎么获得帮助的说明文档。LICENSE文件:版权信息。README.md文件:介绍three.js的一个文件,里面还包含了各个版本的更新内容列表。场景——相机——渲染器从实际生活中拍照角度或是使用三维渲染软件角度理解本节课的案例代码,立方体网格模型和光照组成了一个虚拟的三维场景,相机对象就像你生活中使用的相机一样可以拍照,只不过一个是拍摄真实的景物,一个是拍摄虚拟的景物,拍摄一个物体的时候相机的位置和角度需要设置,虚拟的相机还需要设置投影方式,当你创建好一个三维场景,相机也设置好,就差一个动作“咔”,通过渲染器就可以执行拍照动作。
  • 所需E币: 0
    时间: 2023-7-4 11:31
    大小: 1.77KB
    上传者: 蝴蝶结欧恩
    分享一套WEBGL视频教程——《Three.js可视化企业实战WEBGL视频教程》,2023年7月升级版45章!什么是WebGL。WebGL是在浏览器中实现三维效果的一套规范。使用WebGL原生的API来写3D程序是一件非常痛苦的事情,幸好,有很多同行花业余时间写了一些WebGL开源框架,其中three.js就是非常优秀的一个。什么是threejs,很简单,你将它理解成three+js就可以了。three表示3D的意思,js表示javascript的意思。那么合起来,three.js就是使用javascript来写3D程序的意思。three.js官方定义的三大要素:场景(scene)、相机(camera)、渲染器(render)。我觉得还得加上一个物体(内容)。场景主要包含Object,和灯光。Object有很多类别,主要是点,线,网格Mesh。然后Mesh有是由Geometry和Material材质组成的。Geometry是纯网格顶点信息,有Geometry和BufferGeometry两类,这两类下边又有很多子类。Material是材质信息,下边又有一些子类,比如基础材质,PBR材质,和可配置shader的材质。然后可以在场景里添加灯光。灯光主要有点光源,方向光,聚光灯,面光源。其中面光源用到了比较新的算法,但是目前实现的效果应该还有些问题。相机主要是两大类,透视相机和正交相机。渲染器主要是基于webgl的WebGLRenderer和非webgl的SVGRenderer。要在屏幕上展示3D图形,思路大体上都是这样的:1、构建一个三维空间Three中称之为场景(Scene)2、选择一个观察点,并确定观察方向/角度等Three中称之为相机(Camera)3、在场景中添加供观察的物体Three中的物体有很多种,包括Mesh,Line,Points等,它们都继承自Object3D类4、将观察到的场景渲染到屏幕上的指定区域Three中使用Renderer完成这一工作Three.js应用场景利用Three.JS可以制作出很多酷炫的3D动画,并且Three.js还可以通过鼠标、键盘、拖拽等事件形成交互,在页面上增加一些3D动画和3D交互可以产生更好的用户体验。通过Three.JS可以实现全景视图,这些全景视图应用在房产、家装行业能够带来更直观的视觉体验。在电商行业利用Three.JS可以实现产品的3D效果,这样用户就可以360度全方位地观察商品了,给用户带来更好的购物体验。另外,使用Three.JS还可以制作类似微信跳一跳那样的小游戏。随着技术的发展、基础网络的建设,web3D技术还能得到更广泛的应用。