Loading...
墨滴

张春成

2021/08/05  阅读:31  主题:默认主题

日地月-2

日地月-2

本文是上文《日地月》的补足。 我用THREE.js建立了一个三维模型,还是太阳-地球-月亮互相转动的故事。


片断

由于ObservableHQ不太支持THREE.js这种第三方包的调用, 所以需要在本机建立http服务器, 之后载入THREE.js建立三维模型。

THREE
THREE

重复造轮子的事情是不能再做了, 第三方库真香。

两点小问题

一点小问题是出在服务器搭建的方式上。

  • 由于THREE.js是按照ES6标准,并且使用npm发布的
    • 这就导致了一个小问题;
    • 步子太大扯着了蛋(划掉);
    • 它需要非常严格的文件校验;
    • 也就是说,它在从本地服务器载入js文件时,需要本地服务传入的文件具有明确的application/javascript格式声明;
    • 这是python -m http.server所不支持的;
    • 所以需要改进一下

另一点小问题是出在包的调用场景中。

  • 也是步子太大扯着了蛋的问题(划掉);
  • 载入过程中需要调用的本地包名像是一个目录
  • 而该包中引用的方式是纯文件名
  • 所以要一个一个改,比较烦。

以下是解决第一个问题的代码,(凑字数专用)。 当然,它除了凑字数之外,还有两个挺实用的功能。

  • 它会自动找一个可以使用的端口号使用,自动避免冲突;
  • 它能够在运行过程中显示启动目录和端口号,省得打开之后忘记。
# Use to create local host

import http.server
import socketserver
import threading
import os

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler
Handler.extensions_map.update({
    ".js""application/javascript",
})

while True:
    try:
        httpd = socketserver.TCPServer(("", PORT), Handler)
    except OSError:
        print('E: Port %d is changed into %d' % (PORT, PORT+1))
        PORT += 1
        continue

    break

print('I: Start Server at Port %d' % (PORT))

# httpd.serve_forever()
t = threading.Thread(target=httpd.serve_forever, args=())
t.setDaemon(True)
t.start()

while input('>> ') != 'q':
    print('I: Serving at Port %d on Folder %s' % (PORT, os.getcwd()))
    print('I: Enter "q" to escape.')

print('I: ByeBye')

张春成

2021/08/05  阅读:31  主题:默认主题

作者介绍

张春成