我刚刚开始学习 Three.js,在编写一个函数时遇到了一些麻烦,该函数以对象位置(Vector3)和以毫秒为单位的时间作为参数,并逐渐旋转相机以面对它。本质上是内置 LookAt 方法的 lerp 版本。
首先,我尝试使用 tweenjs 来获得平滑的旋转过渡。对于开始和结束参数,我创建了一个虚拟对象,并将其位置、旋转和四元数设置为与相机相同,然后我使用其上的 LookAt 函数面向对象,并将其四元数存储在新变量“targetQuaternion”。然后我使用这个变量作为TWEEN.Tween方法中的目标参数来更新camera.quaternion。我之前曾尝试过使用四元数来避免健身房锁定,然后尝试旋转,但没有一个能正常工作。
function rotateCameraToObject(object3D, time) {
var cameraPosition = camera.position.clone(); // camera original position
var cameraRotation = camera.rotation.clone(); // camera original rotation
var cameraQuaternion = camera.quaternion.clone(); // camera original quaternion
var dummyObject = new THREE.Object3D(); // dummy object
// set dummyObject's position, rotation and quaternion the same as the camera
dummyObject.position.set(cameraPosition.x, cameraPosition.y, cameraPosition.z);
dummyObject.rotation.set(cameraRotation.x, cameraRotation.y, cameraRotation.z);
dummyObject.quaternion.set(cameraQuaternion.x, cameraQuaternion.y, cameraQuaternion.z);
// lookAt object3D
dummyObject.lookAt(object3D);
// store its quaternion in a variable
var …Run Code Online (Sandbox Code Playgroud) 我做了一个简单的客户端/服务器程序,其中服务器等待外部连接,如果客户端的端口号在[1025-2048]范围内,则返回连接套接字,否则返回-1。问题是,当我通过客户端地址(应存储在结构中)获取端口号时,sockaddr它告诉我客户端端口号为零,但在客户端程序中我已将客户端端口号设置为 1999。
服务器
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
int function(int fd_socket) {
int fd_socket_acc;
int len;
int port;
struct sockaddr_in client_addr;
puts("WAITING FOR CLIENT...");
fd_socket_acc = accept(fd_socket, (struct sockaddr*)&client_addr, &len);
puts("CONNECTION DONE.");
port = ntohs (client_addr.sin_port);
printf("client port number: %d \n", port);
if (port >= 1024 && port <= 2048) {
close (fd_socket_acc);
return fd_socket_acc;
}
else {
close(fd_socket_acc);
return -1;
}
}
int main(int …Run Code Online (Sandbox Code Playgroud)