Бесконечное движение вперед по шахматной доске
Как можно сделать так, чтобы было бесконечное движение вперед по шахматной доске. Есть рисунок, прикрепляю его к вопросу. Представьте, что если мы все время двигаемся вперед не останавливаясь. Возможно ли такое сделать?
Вот шахматная доска на css:
.chess-board {
border-spacing: 0;
border-collapse: collapse;
}
.chess-board th {
padding: .5em;
}
.chess-board td {
border: 1px solid;
width: 2em;
height: 2em;
}
.chess-board .light {
background: #eee;
}
.chess-board .dark {
background: #000;
}
<table class="chess-board">
<tbody>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
<tr>
<th></th>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
</tr>
<tr>
<th></th>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
</tr>
<tr>
<th></th>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
</tr>
<tr>
<th></th>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
</tr>
<tr>
<th></th>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
</tr>
<tr>
<th></th>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
</tr>
<tr>
<th></th>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
</tr>
<tr>
<th></th>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
<td class="dark"></td>
<td class="light"></td>
</tr>
</tbody>
</table>
А нужно сделать, чтобы было так, и бесконечное движение вперед:
Ответы (2 шт):
Автор решения: Sevastopol'
→ Ссылка
Подобное где-то я уже встречал:
* {
margin: 0;
padding: 0;
}
.wrp {
position: relative;
overflow: hidden;
height: 100vh;
perspective: 100vh;
}
#chessboard {
width: 200%;
height: 120vh;
background: linear-gradient(rgba(255, 255, 255, 1) 0, rgba(255, 255, 255, 0) 600px), linear-gradient(45deg, black 25%, transparent 25%, transparent 75%, black 75%, black), linear-gradient(45deg, black 25%, transparent 25%, transparent 75%, black 75%, black);
background-color: white;
background-size: 100% 100%, 60px 60px, 60px 60px;
background-position: 0 0, 0 0, 30px 30px;
margin-left: -50%;
transform: rotateX(75deg);
animation: chessboard .5s infinite linear;
}
@keyframes chessboard {
to {
background-position: 0 0, 0 60px, 30px 90px;
}
}
<div class="wrp">
<div id="chessboard"></div>
</div>
Автор решения: Stranger in the Q
→ Ссылка
Как-то так, надо еще со сглаживанием поработать...
let canvas = document.querySelector('canvas');
let gl = canvas.getContext('webgl');
let pid = gl.createProgram();
shader(`
attribute vec2 coords;
void main(void) {
gl_Position = vec4(coords.xy, 0.0, 1.0);
}
`, gl.VERTEX_SHADER);
shader(`
precision highp float;
uniform vec2 res;
uniform float time;
float rayMarch( in vec3 ro, in vec3 rd, float tmax ){
float t = 0.0;
float h = (1.0-ro.y)/rd.y;
for( int i=0; i<9; i++ ){
vec3 pos = ro + t*rd;
float h = pos.y;
if( h<0.001 || t>tmax ) break;
t += h;
}
return t;
}
vec3 render( in vec3 ro, in vec3 rd ) {
vec3 col = vec3(0.);
float t = rayMarch( ro, rd, 10. );
vec3 pos = ro + t*rd;
if (fract(pos.x)>0.5 && fract(pos.z)<0.5)
return vec3(1.);
if (fract(pos.x)<0.5 && fract(pos.z)>0.5)
return vec3(1.);
return vec3(0.);
}
mat3 setCamera( in vec3 ro, in vec3 rt, in float cr ) {
vec3 cw = normalize(rt-ro);
vec3 cp = vec3(sin(cr), cos(cr),0.0);
vec3 cu = normalize( cross(cw,cp) );
vec3 cv = normalize( cross(cu,cw) );
return mat3( cu, cv, -cw );
}
void main(void) {
vec2 uv = gl_FragCoord.xy/res;
vec2 p = uv-0.5;
vec3 ro = vec3( sin(time), 1.0, time);
vec3 rt = vec3( sin(time), 0.3, time+1. );
mat3 cam = setCamera( ro, rt, 0.0 );
vec3 rd = normalize( cam * vec3( p, -1.0) );
vec3 c = render( ro, rd );
gl_FragColor = vec4(c, 1.0 );
}
`, gl.FRAGMENT_SHADER);
gl.linkProgram(pid);
gl.useProgram(pid);
let array = new Float32Array([-1, 3, -1, -1, 3, -1]);
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW);
let coords = gl.getAttribLocation(pid, "coords");
gl.vertexAttribPointer(coords, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(coords);
let res = gl.getUniformLocation(pid, 'res');
let time = gl.getUniformLocation(pid, 'time');
let x = 0, y = 0;
let changeCenter = e => {
e = e.touches ? e.touches[0] : e;
let z = window.getComputedStyle(canvas).zoom || 1;
let d = document.documentElement;
x = (e.clientX + d.scrollLeft - canvas.offsetLeft*z) / z;
y = (e.clientY + d.scrollTop - canvas.offsetTop*z) / z
}
window.addEventListener('resize', resize);
resize();
requestAnimationFrame(draw)
function draw(t) {
gl.uniform2f(res, gl.drawingBufferWidth, gl.drawingBufferHeight);
gl.uniform1f(time, t/1000);
gl.drawArrays(gl.TRIANGLES, 0, 3);
requestAnimationFrame(draw)
}
function shader(src, type) {
let sid = gl.createShader(type);
gl.shaderSource(sid, src);
gl.compileShader(sid);
gl.attachShader(pid, sid);
}
function resize(){
canvas.width = innerWidth;
canvas.height = innerHeight;
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
}
body {
margin:0;
overflow:hidden;
}
<canvas/>
