『小熊带你玩科技』KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下,如何用2( 五 )


//updateplayervelocitylastVelocity=velocity.Add(0);velocity.y+=gravity;velocity.x*=lateralDamp;velocity.z=Math.max(0,time?forwardDamp*velocity.z:0);
//addvelocitytopositionposition=position.Add(velocity);//limitplayerxposition(howfaroffroad)position.x=Clamp(position.x,-maxPlayerX,maxPlayerX);
//checkifongroundif(position.y<roadY){position.y=roadY;//matchytogroundplaneairFrame=0;//resetairframes//getthedotproductofthegroundnormalandthevelocitydp=Math.cos(roadA)*velocity.y+Math.sin(roadA)*velocity.z;//bouncevelocityagainstgroundnormalvelocity=newVec3(0,Math.cos(roadA),Math.sin(roadA)).Multiply(-elasticity*dp).Add(velocity);//applyplayerbrakeandaccelvelocity.z+=mouseDown?playerBrake:Lerp(velocity.z/maxSpeed,mousePressed*playerAccel,0);//checkifoffroadif(Math.abs(position.x)>road[s].w){velocity.z*=offRoadDamp;//slowdownpitchSpring+=Math.sin(position.z/99)**4/99;//rumble}}
//updateplayerturningandapplycentrifugalforceturn=Lerp(velocity.z/maxSpeed,mouseX*turnControl,0);velocity.x+=velocity.z*turn-velocity.z**2*centrifugal*roadX;
//updatejumpif(airFrame++&&mouseDown&&mouseUpFrames&&mouseUpFrames{velocity.y+=jumpAccel;//applyjumpvelocityairFrame=9;//preventjumpingagain}mouseUpFrames=mouseDown?0:mouseUpFrames+1;
//pitchdownwithverticalvelocitywheninairairPercent=(position.y-roadY)/99;pitchSpringSpeed+=Lerp(airPercent,0,velocity.y/4e4);
//updateplayerpitchspringpitchSpringSpeed+=(velocity.z-lastVelocity.z)/2e3;pitchSpringSpeed-=pitchSpring*springConstant;pitchSpringSpeed*=pitchSpringDamp;pitchSpring+=pitchSpringSpeed;pitchRoad=Lerp(pitchLerp,pitchRoad,Lerp(airPercent,-roadA,0));playerPitch=pitchSpring+pitchRoad;
//updateheadingheading=ClampAngle(heading+velocity.z*roadX*worldRotateScale);cameraHeading=turn*cameraTurnScale;
//wascheckpointcrossed?if(position.z>nextCheckPoint){time+=checkPointTime;//addmoretimenextCheckPoint+=checkPointDistance;//setnextcheckpointhueShift+=36;//shifthue}
预渲染
在渲染之前 , 可以通过设置画布的宽度和高度来清除画布 。 这也适用于用画布填充窗口 。
我们还计算了用于将世界点转换为画布空间的投影比例 。 「cameraDepth」值表示摄像机的视野(FOV) , 本游戏中其视野为90度 。 计算公式为「1/Math.tan((fovRadians/2))」 , 对于90度的FOV来说 , 其结果正好是1 。 为了保持纵横比 , 投影按「c.width」进行缩放 。
//clearthescreenandsetsizec.width=window.innerWidth,c.height=window.innerHeight;
//calculateprojectionscale,flipyprojectScale=(newVec3(1,-1,1)).Multiply(c.width/2/cameraDepth);
画出天空、太阳和月亮
『小熊带你玩科技』KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下,如何用2
文章图片
背景氛围是通过全屏线性渐变绘制的 , 它会根据太阳的方向更改颜色 。
为了节省空间 , 我们使用具有透明度的全屏径向渐变在同一个for循环中绘制太阳和月亮 。
线性和径向渐变相结合 , 构成了一个完全环绕场景的天空 。
//gethorizon,offset,andlightamounthorizon=c.height/2-Math.tan(playerPitch)*projectScale.y;backgroundOffset=Math.sin(cameraHeading)/2;light=Math.cos(heading);
//createlineargradientforskyg=context.createLinearGradient(0,horizon-c.height/2,0,horizon);g.addColorStop(0,LSHA(39+light*25,49+light*19,230-light*19));g.addColorStop(1,LSHA(5,79,250-light*9));