一键免费下载MegascansCG资源,一键免费白嫖quixel近20000个正版CG设计资源

免费白嫖quixel近20000个正版CG设计资源
Quixel介绍
Quixel由Teddy Bergsman和Waqar Azim于2011年创办,总部位于瑞典,全球6个国家/地区的100多名员工正在加入Epic Games团队。 Quixel的产品包括Megascans,Megascans是一个广泛的2D和3D摄影测量资源库,并由随附的应用程序Bridge和Mixer支持。
在世界各地,领先的游戏开发商,电影制片人和可视化专家都使用Quixel Megascans资产制作了大片游戏(《地铁:离乡》,《命运2》,《战地风云5》),动画娱乐(《奇幻森林》,《黑豹》,《狮子王》,《环太平洋:雷霆再起》)和逼真的场景(通过高质量的内容并使用各种工具)。
建立逼真的3D内容是游戏开发和电影制作中的一项昂贵的工作。 Epic Games创始人兼首席执行官Tim Sweeney表示,通过与Quixel携手合作,使Megascans在Unreal Engine中免费使用,这种艺术水平现在对从3A工作室到独立游戏的每个人都可用。
“我们在Quixel的使命一直是通过超高分辨率扫描使每个人都可以访问世界。作为Epic Games的一部分,我们现在可以通过扩大Megascans库,加快Bridge和Mixer的开发速度以及改善与所有主要3D软件和渲染器的集成来加速这一愿景。”

quixel近20000个正版CG设计资源
Quixel Megascans库免费提供近20,000多种资源供虚幻引擎全部使用
由于 quixel 正在被移除,所有物品都可以免费获得。此脚本用于自动将物品添加到您的帐户(截至撰写本文时,总共有 件18874物品)
此脚本用于从quixel添加所有项目的脚本
如何使用
注意:此脚本仅在最新版本的 Chrome浏览器 中测试过。此获取方法仅在2025年以前可用。
- 复制下面的脚本(
run.js)(脚本在文章的最后面) - 登录https://quixel.com
- 前往https://quixel.com/megascans/collections
- 打开 devtools (F12) -> 转到“控制台(console)”选项卡
- 粘贴脚本并按Enter。
- 将会弹出一个对话框确认执行,单击“确定”
- 坐下来等待
常见问题
- 收到“禁止访问”错误。(即使刷新后,整个页面仍显示“禁止访问”)
- API 添加速度过快可能会导致您达到 API 的速率限制。(我的测试是在 10 页之后进行的,所以大约有 10k 个项目)。
- 等待约 10-20 分钟后继续。
Common Fixes -> Restart script加载https://quixel.com后请参阅继续执行。
- 脚本似乎已暂停/挂起
- 可能是日志记录太多了。尝试监控脚本,如果显示“END PAGE X”,记下页码(以备需要重新启动)并通过单击 devtools 中的“🚫”图标清除控制台。
- 参见
Common Fixes -> Restart script修复。
- 获取错误
**UNABLE TO ADD ITEM**- 应该会有 中显示的错误信息
( )。如果是user already owns specified asset at a higher or equal resolution,则表示它已在您的帐户中。
- 应该会有 中显示的错误信息
- 获取错误
cannot find authentication token. Please login again- 清除浏览器 cookies 并重新登录 quixel。尝试手动添加 1 个项目。如果成功,则查看
Common Fixes -> Restart script是否继续执行。
- 清除浏览器 cookies 并重新登录 quixel。尝试手动添加 1 个项目。如果成功,则查看
常见修复
重新运行脚本
- 注意它正在运行哪个页面
- 复制
run.js脚本 startPage = 0将第一行更新为startPage = 10(假设第 10 页被挂起),测试也可以不写,让它自动从第一页开始遍历添加材质。
更改日志
- 初始脚本发布
- 更新以清除日志以减少挂起的机会
- [当前] 跳过添加已获得的物品。减少日志。脚本完成后添加更多信息以显示购买的物品数量。由于现在跳过了购买的物品,从技术上讲您不再需要指定
startPage。
run.js脚本:
((async (startPage = 0, autoClearConsole = true) => {
const getCookie = (name) => {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
const callCacheApi = async (params = {}) => {
const defaultParams = {
page: 0,
maxValuesPerFacet: 1000,
hitsPerPage: 1000,
attributesToRetrieve: ["id", "name"].join(",")
}
const response = await fetch("https://proxy-algolia-prod.quixel.com/algolia/cache", {
"headers": {
"x-api-key": "2Zg8!d2WAHIUW?pCO28cVjfOt9seOWPx@2j"
},
"body": JSON.stringify({
url: "https://6UJ1I5A072-2.algolianet.com/1/indexes/assets/query?x-algolia-application-id=6UJ1I5A072&x-algolia-api-key=e93907f4f65fb1d9f813957bdc344892",
params: new URLSearchParams({ ...defaultParams, ...params }).toString()
}),
"method": "POST",
})
return await response.json()
}
const callAcl = async ({ id, name }) => {
const response = await fetch("https://quixel.com/v1/acl", {
"headers": {
"authorization": "Bearer " + authToken,
"content-type": "application/json;charset=UTF-8",
},
"body": JSON.stringify({ assetID: id }),
"method": "POST",
});
const json = await response.json()
if (json?.isError) {
console.error(` --> **UNABLE TO ADD ITEM** Item ${id} | ${name} (${json?.msg})`)
} else {
console.log(` --> ADDED ITEM Item ${id} | ${name}`)
}
}
const callAcquired = async () => {
const response = await fetch("https://quixel.com/v1/assets/acquired", {
"headers": {
"authorization": "Bearer " + authToken,
"content-type": "application/json;charset=UTF-8",
},
"method": "GET",
});
return await response.json()
}
// 1. Check token exist, quixel API needs it
console.log("-> Checking Auth API Token...")
let authToken = ""
try {
const authCookie = getCookie("auth") ?? "{}"
authToken = JSON.parse(decodeURIComponent(authCookie))?.token
if (!authToken) {
return console.error("-> Error: cannot find authentication token. Please login again.")
}
} catch (_) {
return console.error("-> Error: cannot find authentication token. Please login again.")
}
// 2. Get all currently acquired items
console.log("-> Get Acquired Items...")
const acquiredItems = (await callAcquired()).map(a => a.assetID)
// 3. Get total count of items
console.log("-> Getting Total Number of Pages....")
const { nbPages: totalPages, hitsPerPage: itemsPerPage, nbHits: totalItems } = await callCacheApi()
console.log("-> ==============================================")
console.log(`-> Total # of items: ${totalItems}`)
console.log(`-> ${totalPages} total pages with ${itemsPerPage} per page`)
console.log(`-> Total Items to add: ${(totalItems - acquiredItems.length)}.`)
console.log("-> ==============================================")
if (!confirm(`Click OK to start adding ${(totalItems - acquiredItems.length)} items in your account.`)) return
// Loop
for (let pageIdx = startPage || 0; pageIdx < totalPages; pageIdx++) {
console.log(`-> ======================= PAGE ${pageIdx + 1}/${totalPages} START =======================`)
console.log("-> Getting Items from page " + (pageIdx + 1) + " ...")
const { hits: items } = await callCacheApi({ page: pageIdx })
console.log("-> Adding non-acquired items...")
// Filter out owned items
const unownedItems = items.filter(i => !acquiredItems.includes(i.id))
const aclPromises = unownedItems.map(callAcl)
await Promise.all(aclPromises)
console.log(`-> ======================= PAGE ${pageIdx + 1}/${totalPages} COMPLETED =======================`)
if (autoClearConsole) console.clear() // Fix the issue that too much log hangs the console. Set autoClearConsole = false to keep the logs
}
console.log("-> Getting new acquired info...")
// Get acquired items again
const newItemsAcquired = (await callAcquired()).length
const newTotalCount = (await callCacheApi()).nbHits
console.log(`-> Completed. Your account now have a total of ${newItemsAcquired} out of ${newTotalCount} items.`)
alert(`-> Your account now have a total of ${newItemsAcquired} out of ${newTotalCount} items.\n\nIf you find some items missing, try refresh the page and run the script again.`)
})())

评论0