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


//drawskyasfullscreenpolyDrawPoly(c.width/2,0,c.width/2,c.width/2,c.height,c.width/2,g);
//drawsunandmoon(0=sun,1=moon)for(i=2;i--;){//createradialgradientg=context.createRadialGradient(x=c.width*(.5+Lerp((heading/PI/2+.5+i/2)%1,4,-4)-backgroundOffset),y=horizon-c.width/5,c.width/25,x,y,i?c.width/23:c.width);g.addColorStop(0,LSHA(i?70:99));g.addColorStop(1,LSHA(0,0,0,0));//drawfullscreenpolyDrawPoly(c.width/2,0,c.width/2,c.width/2,c.height,c.width/2,g);}
画出山和地平线
山是通过在地平线上绘制50个三角形来程序化地生成的 。 当我们面向太阳时 , 由于山处于阴影中 , 所以山的光线会更暗 。 此外 , 附近的山更暗 , 以模拟雾的效果 。 这里真正的诀窍是调整大小和颜色的随机值以获得良好的结果 。
绘制背景的最后一部分是绘制地平线 , 并用纯绿色填充地平线的下方 。
『小熊带你玩科技』KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下,如何用2
文章图片
//setrandomseedformountainsrandSeed=startRandSeed;
//drawmountainsfor(i=mountainCount;i--;){angle=ClampAngle(heading+R(19));light=Math.cos(angle-heading);DrawPoly(x=c.width*(.5+Lerp(angle/PI/2+.5,4,-4)-backgroundOffset),y=horizon,w=R(.2,.8)**2*c.width/2,x+w*R(-.5,.5),y-R(.5,.8)*w,0,LSHA(R(15,25)+i/3-light*9,i/2+R(19),R(220,230)));}
//drawhorizonDrawPoly(c.width/2,horizon,c.width/2,c.width/2,c.height,c.width/2,LSHA(25,30,95));
将路段投影到画布空间
在渲染道路之前 , 我们必须首先获取投影后的道路点 。 第一部分比较复杂 , 因为我们的道路的x值需要转换为世界空间位置 。 为了使道路看起来是弯曲的 , 我们将x值作为二阶导数 。 这就是奇怪的代码「x+=w+=」的作用 。 由于这种工作方式 , 路段并没有固定的世界空间位置 , 而是基于玩家的位置重新计算每一帧 。
有了世界空间位置后 , 我们便能够用道路位置减去玩家位置以获得当前的摄像头空间位置 。 代码的其余部分实现了不同的变换 , 首先旋转航向、俯仰角 , 然后进行投影变换 , 使更远的东西看起来更小 , 最后将其映射到画布空间 。
for(x=w=i=0;i<drawDistance+1;){p=newVec3(x+=w+=road[s+i].x,//sumlocalroadoffsetsroad[s+i].y,(s+i)*segmentLength)//roadyandzpos.Add(position.Multiply(-1));//getlocalcameraspace
//applycameraheadingp.x=p.x*Math.cos(cameraHeading)-p.z*Math.sin(cameraHeading);//tiltcamerapitchandinvertzz=1/(p.z*Math.cos(playerPitch)-p.y*Math.sin(playerPitch));p.y=p.y*Math.cos(playerPitch)-p.z*Math.sin(playerPitch);p.z=z;//projectroadsegmenttocanvasspaceroad[s+i++].p=//projectedroadpointp.Multiply(newVec3(z,z,1))//projection.Multiply(projectScale)//scale.Add(newVec3(c.width/2,c.height/2));//centeroncanvas}
绘制路段
现在 , 我们有了每个路段的画布空间点 , 渲染就相当简单了 。 我们需要从后到前绘制每个路段 , 或者更具体地说 , 画出连接路段的梯形多边形 。
为了创建道路 , 我们需要在每个路段上进行4层渲染:地面 , 条纹路缘 , 道路本身和虚线白线 。 根据道路线段的坡度和方向为每个阴影着色 , 并根据该图层的外观添加一些额外的逻辑 。
我们需要检查路段是否在近/远剪辑范围中 , 以防止出现怪异的渲染伪像 。 此外 , 还有一个很好的优化方法 , 可以在道路变得很细时按距离缩小道路分辨率 。 这样就在没有明显的质量损失的情况下 , 将绘图次数减少了一半以上 , 从而获得了巨大的性能提升 。
『小熊带你玩科技』KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下,如何用2